/ Hex Artifact Content
Login

Artifact 083ced0941ef7c3bcb667b7319114ab492ed4325:


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 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  r..*/.static Pgn
5f00: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
5f10: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5f20: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
5f30: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5f40: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
5f50: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
5f60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5f70: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
5f80: 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  );.  nPagesPerMa
5f90: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
5fa0: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
5fb0: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
5fc0: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
5fd0: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
5fe0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
5ff0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
6000: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
6010: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
6020: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
6030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
6040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
6050: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6060: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6070: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6080: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
6090: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
60a0: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
60b0: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
60c0: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
60d0: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
60e0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
60f0: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
6100: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
6110: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
6120: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
6130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6140: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
6150: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6160: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
6170: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
6180: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
6190: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
61a0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
61b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
61c0: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
61d0: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
61e0: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
61f0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
6200: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6210: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
6220: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
6230: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6240: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
6250: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
6260: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
6270: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
6280: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
6290: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
62a0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
62b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
62c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
62d0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
62e0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
62f0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
6300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6310: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6320: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6330: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
6340: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
6350: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
6360: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
6370: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6380: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
6390: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
63a0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
63b0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
63c0: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
63d0: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
63e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
63f0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6400: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6410: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
6420: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6430: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6440: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6450: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6460: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6470: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
6480: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
6490: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
64a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
64b0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
64c0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
64d0: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
64e0: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
64f0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6500: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
6510: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
6520: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6530: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6540: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6550: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
6560: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6570: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6580: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6590: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
65a0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
65b0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
65c0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
65d0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
65e0: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
65f0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6600: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6610: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6620: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6630: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6640: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6650: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6660: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6670: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6680: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6690: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
66a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
66b0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
66c0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
66d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
66e0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
66f0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6700: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6710: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6720: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6730: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6740: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6750: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6760: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6770: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6780: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6790: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
67a0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
67b0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
67c0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
67d0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
67e0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
67f0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6800: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6810: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6820: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6830: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6840: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6850: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6860: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6870: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6880: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6890: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
68a0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
68b0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
68c0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
68d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
68e0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
68f0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6900: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6910: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6920: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6930: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6940: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6950: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6960: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6970: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6980: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6990: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
69a0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
69b0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
69c0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
69d0: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ey);.  assert( p
69e0: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
69f0: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
6a00: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
6a10: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
6a20: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
6a30: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
6a40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
6a50: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
6a60: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
6a70: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
6a80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6a90: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
6aa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
6ab0: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
6ac0: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
6ad0: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
6ae0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6af0: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
6b00: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
6b10: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
6b20: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
6b30: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
6b40: 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a  , y, rc).#endif.
6b50: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
6b60: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
6b70: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
6b80: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
6b90: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
6ba0: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
6bb0: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
6bc0: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
6bd0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6be0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6bf0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
6c00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
6c10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
6c20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
6c30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
6c40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
6c50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
6c60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
6c70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
6c80: 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b  yte(&(P)->aData[
6c90: 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  (P)->cellOffset+
6ca0: 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a  2*(I)])))../*.**
6cb0: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
6cc0: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
6cd0: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
6ce0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
6cf0: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
6d00: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6d10: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
6d20: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
6d30: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6d40: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6d50: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
6d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d70: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6d80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
6d90: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
6da0: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
6db0: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
6dc0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
6dd0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
6de0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
6df0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
6e00: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
6e10: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
6e20: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
6e30: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
6e40: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
6e50: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
6e60: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
6e70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
6e80: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
6e90: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
6ea0: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
6eb0: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
6ec0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
6ed0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
6ee0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
6ef0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
6f00: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
6f10: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
6f20: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
6f30: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
6f40: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
6f50: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6f60: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
6f70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
6f80: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
6f90: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
6fa0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
6fb0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
6fc0: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
6fd0: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
6fe0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
6ff0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7000: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
7010: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
7020: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
7030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
7040: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7050: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
7060: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
7070: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
7080: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
7090: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
70a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
70b0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
70c0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
70d0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
70e0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
70f0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
7100: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7120: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
7130: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
7140: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
7150: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7160: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7170: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
7180: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
7190: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
71a0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
71b0: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
71c0: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
71d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
71e0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
71f0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
7200: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
7210: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
7220: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
7230: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
7240: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7250: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7260: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7270: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7280: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7290: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
72a0: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
72b0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
72c0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
72d0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
72e0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
72f0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
7300: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
7310: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
7320: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
7330: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7340: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7350: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
7360: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
7370: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
7380: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
7390: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
73a0: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74  ader = n;.  test
73b0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
73c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
73d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
73e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
73f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7400: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
7410: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
7420: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
7430: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
7440: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
7450: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
7460: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
7470: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
7480: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
7490: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
74a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
74b0: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
74c0: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
74d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
74e0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53   bytes */.    nS
74f0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
7500: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
7510: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7520: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7530: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7540: 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20  .    if( (nSize 
7550: 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  & ~3)==0 ){.    
7560: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20    nSize = 4;    
7570: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63      /* Minimum c
7580: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
7590: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
75a0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e  ->nSize = (u16)n
75b0: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
75c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
75d0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
75e0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
75f0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
7600: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
7610: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
7620: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
7630: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
7640: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
7650: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
7660: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
7670: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
7680: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
7690: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
76a0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
76b0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
76c0: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
76d0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
76e0: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
76f0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
7700: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
7710: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
7720: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
7730: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
7740: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
7750: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
7760: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
7770: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
7780: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
7790: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
77a0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
77b0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
77c0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
77d0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
77e0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
77f0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7800: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7810: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
7820: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
7830: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
7840: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
7850: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
7860: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
7870: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7880: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
7890: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
78a0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
78b0: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
78c0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
78d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
78e0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
78f0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7900: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
7910: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7920: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
7930: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
7940: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
7950: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7960: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
7970: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
7980: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7990: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
79a0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
79b0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
79c0: 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e   = (u16)(pInfo->
79d0: 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20  nLocal + n);.   
79e0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
79f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7a00: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
7a10: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
7a20: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7a30: 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73  o) \.  btreePars
7a40: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
7a50: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
7a60: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
7a70: 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f  Info)).static vo
7a80: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7a90: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
7aa0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7ab0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7ac0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
7ad0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
7ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
7af0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
7b00: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
7b10: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
7b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
7b30: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
7b40: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
7b50: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7b60: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
7b70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
7b80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
7b90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
7ba0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
7bb0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
7bc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
7bd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
7be0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
7bf0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
7c00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
7c10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
7c20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
7c30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
7c40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
7c50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
7c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
7c70: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
7c80: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
7c90: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
7ca0: 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67  er = &pCell[pPag
7cb0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
7cc0: 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a  ;.  u32 nSize;..
7cd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7ce0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
7cf0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
7d00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7d10: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
7d20: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
7d30: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
7d40: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
7d50: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
7d60: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
7d70: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
7d80: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
7d90: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
7da0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
7db0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
7dc0: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
7dd0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
7de0: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
7df0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
7e00: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72  debuginfo;.  btr
7e10: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
7e20: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
7e30: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
7e40: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ..  if( pPage->i
7e50: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20  ntKey ){.    u8 
7e60: 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  *pEnd;.    if( p
7e70: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7e80: 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  .      pIter += 
7e90: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
7ea0: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d  r, nSize);.    }
7eb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
7ec0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
7ed0: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
7ee0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
7ef0: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
7f00: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
7f10: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
7f20: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
7f30: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
7f40: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
7f50: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
7f60: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
7f70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7f80: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
7f90: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
7fa0: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
7fb0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
7fc0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
7fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
7fe0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
7ff0: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
8000: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
8010: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8020: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8030: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8040: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8050: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e   );.  if( nSize>
8060: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8070: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  ){.    int minLo
8080: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
8090: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
80a0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
80b0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
80c0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
80d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
80e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
80f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8100: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
8110: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8120: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8130: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
8140: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
8150: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
8160: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
8170: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
8180: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d  ;.  }.  nSize +=
8190: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
81a0: 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Cell);..  /* The
81b0: 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
81c0: 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62   any cell is 4 b
81d0: 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  ytes. */.  if( n
81e0: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53  Size<4 ){.    nS
81f0: 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  ize = 4;.  }..  
8200: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
8210: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29  ebuginfo.nSize )
8220: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
8230: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  nSize;.}..#ifdef
8240: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
8250: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
8260: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
8270: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
8280: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
8290: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
82a0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
82b0: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
82c0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
82d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
82e0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
82f0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
8300: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
8310: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8320: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8330: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
8340: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
8350: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
8360: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
8370: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
8380: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
8390: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
83a0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
83b0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
83c0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
83d0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
83e0: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
83f0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8400: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
8410: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
8420: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8430: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
8440: 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65  ll!=0 );.  btree
8450: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
8460: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
8470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
8480: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
8490: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
84a0: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
84b0: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  load );.  if( in
84c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
84d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
84e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
84f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
8500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
8510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
8520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
8530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
8540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
8550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
8560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
8570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
8580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
8590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
85a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
85b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
85c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
85d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
85e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
85f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
8600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
8610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
8620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8630: 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rea..*/.static i
8640: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
8650: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8660: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8690: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
86c0: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
86d0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
86e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
86f0: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
8700: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
8710: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
8720: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8730: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
8740: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
8750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8760: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
8770: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
8780: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
8790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
87a0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
87b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
87c0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
87f0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8800: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
8810: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8820: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8830: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
8840: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
8850: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
8860: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
8870: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
8880: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
8890: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
88a0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
88b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
88c0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
88d0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
88e0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
88f0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
8900: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
8910: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
8920: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
8930: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8940: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8950: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8960: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8970: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
8980: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8990: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
89a0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
89b0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
89c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
89d0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
89e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
89f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8a00: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8a10: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
8a20: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
8a30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
8a40: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
8a50: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
8a60: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8a70: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
8a80: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
8a90: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
8aa0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
8ab0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
8ac0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
8ad0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
8ae0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
8af0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8b00: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
8b10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8b20: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
8b30: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
8b40: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
8b50: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
8b60: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
8b70: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
8b80: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
8b90: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
8ba0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
8bb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8bc0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
8bd0: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
8be0: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
8bf0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
8c00: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
8c10: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
8c20: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
8c30: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
8c40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8c50: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
8c60: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8c70: 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65  lLast );.#if !de
8c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c90: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8ca0: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20  L_CHECK).    /* 
8cb0: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
8cc0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
8cd0: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
8ce0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
8cf0: 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f     ** if SQLITE_
8d00: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
8d10: 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65  CELL_CHECK is de
8d20: 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20  fined .    */.  
8d30: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
8d40: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
8d50: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
8d60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8d70: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
8d80: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
8d90: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
8da0: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
8db0: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
8dc0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
8dd0: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
8de0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
8df0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8e00: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8e10: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8e20: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8e30: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
8e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8e50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8e60: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
8e70: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8e80: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
8e90: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
8ea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8eb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8ec0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
8ed0: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
8ee0: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
8ef0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
8f00: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8f10: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
8f20: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
8f30: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
8f40: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
8f50: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
8f60: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
8f70: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
8f80: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
8f90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
8fa0: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
8fb0: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
8fc0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
8fd0: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
8fe0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
8ff0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
9000: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9010: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
9020: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
9030: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
9040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9050: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
9060: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9070: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
9080: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
9090: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
90a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
90b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
90c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
90d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
90e0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
90f0: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
9100: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
9110: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
9120: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9130: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
9140: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
9150: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
9160: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
9170: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
9180: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
9190: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
91a0: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
91b0: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
91c0: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
91d0: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
91e0: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
91f0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
9200: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
9210: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
9220: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
9230: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
9240: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
9250: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
9260: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
9270: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
9280: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
9290: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
92a0: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
92b0: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
92c0: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
92d0: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
92e0: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
92f0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
9300: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
9310: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
9320: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
9330: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
9340: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
9350: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
9360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
9370: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
9380: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9390: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
93a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
93b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
93c0: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
93d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
93e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
93f0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
9400: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9410: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
9420: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
9430: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
9440: 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Frag;           
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61  /* Number of fra
9470: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
9480: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
9490: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
94c0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
94d0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
94e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
94f0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
9500: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
9510: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
9520: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
9530: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
9540: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
9550: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
9560: 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
9570: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
9580: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
9590: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
95a0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
95b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
95c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
95d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
95e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
95f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9600: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9610: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
9620: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
9630: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
9640: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
9650: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
9660: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
9670: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75  erflow==0 );.  u
9680: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
9690: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
96a0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  ze;.  assert( nB
96b0: 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65  yte < usableSize
96c0: 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  -8 );..  nFrag =
96d0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
96e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
96f0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9700: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9710: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9720: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9730: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9740: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
9750: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9760: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
9770: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
9780: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9790: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
97a0: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
97b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
97c0: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
97d0: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
97e0: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
97f0: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
9800: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
9810: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
9820: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
9830: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
9840: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9850: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9860: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
9870: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9880: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d  ata[hdr+5]);.  }
9890: 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d  else if( gap+2<=
98a0: 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  top ){.    /* Se
98b0: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
98c0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
98d0: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
98e0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
98f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75  .    ** the requ
9900: 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74  est. The allocat
9910: 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d  ion is made from
9920: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
9930: 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  slot in .    ** 
9940: 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
9950: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
9960: 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a   accomadate it..
9970: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70      */.    int p
9980: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
9990: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
99a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
99b0: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
99c0: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
99d0: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
99e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
99f0: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
9a00: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
9a10: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
9a20: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
9a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9a40: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9a50: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
9a60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9a70: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
9a80: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
9a90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
9aa0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
9ab0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9ac0: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
9ad0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
9ae0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
9af0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
9b00: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
9b10: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
9b20: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
9b30: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
9b40: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
9b50: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
9b60: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
9b70: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
9b80: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
9b90: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
9ba0: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
9bb0: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
9bc0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
9bd0: 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20  e if( size+pc > 
9be0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
9bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9c00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9c10: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
9c20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
9c30: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
9c40: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
9c50: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
9c60: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
9c70: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
9c80: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
9c90: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
9ca0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
9cb0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
9cc0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
9cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9ce0: 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a  *pIdx = pc + x;.
9cf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9d00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
9d10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
9d20: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
9d30: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e  sure there is en
9d40: 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68  ough space in th
9d50: 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79  e gap to satisfy
9d60: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61  .  ** the alloca
9d70: 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64  tion.  If not, d
9d80: 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  efragment..  */.
9d90: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
9da0: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
9db0: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
9dc0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20  e>top ){.    rc 
9dd0: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
9de0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
9df0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9e00: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
9e10: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
9e20: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
9e30: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
9e40: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
9e50: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
9e60: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
9e70: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
9e80: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9e90: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
9ea0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9eb0: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
9ec0: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
9ed0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
9ee0: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
9ef0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
9f00: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
9f10: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
9f20: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
9f30: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
9f40: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
9f50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
9f60: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
9f70: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
9f80: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
9f90: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
9fa0: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
9fb0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
9fc0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
9fd0: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
9fe0: 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d 3e 70  Byte <= pPage->p
9ff0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a000: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
a010: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a030: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a040: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a050: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a060: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
a070: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
a080: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
a090: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
a0a0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
a0b0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
a0c0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
a0d0: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
a0e0: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
a0f0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
a100: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
a110: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
a120: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
a130: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
a140: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
a150: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
a160: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
a170: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
a180: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
a190: 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  hdr;.  int iLast
a1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
a1c0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
a1d0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
a1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a1f0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
a200: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
a210: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a220: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a230: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a240: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a250: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
a260: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
a270: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
a280: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
a290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
a2a0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
a2b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a2c0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a2d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a2e0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a2f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a300: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
a310: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
a320: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20   size is 4 */.. 
a330: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
a340: 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
a350: 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
a360: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
a370: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
a380: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
a390: 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
a3a0: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
a3b0: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
a3c0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
a3d0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  size);.  }..  /*
a3e0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
a3f0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
a400: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
a410: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
a420: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
a430: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
a440: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
a450: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
a460: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
a470: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
a480: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
a490: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
a4a0: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
a4b0: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
a4c0: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
a4d0: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
a4e0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
a4f0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
a500: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
a510: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
a520: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
a530: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
a540: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
a550: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
a560: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
a570: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
a580: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
a590: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
a5a0: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
a5b0: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
a5c0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
a5d0: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
a5e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a5f0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
a600: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
a610: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a620: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
a630: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
a640: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
a650: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a660: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
a670: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
a680: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
a690: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
a6a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a6b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a6c0: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a6d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a6e0: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a6f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a700: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a710: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a720: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a730: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a740: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a750: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a760: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a770: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a780: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a790: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a7a0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a7b0: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a7c0: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a7d0: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a7e0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a7f0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a800: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a810: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a820: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a830: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a840: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a850: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a860: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a870: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a880: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a890: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a8a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a8b0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a8c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a8d0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a8e0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a8f0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a900: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a910: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a920: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a930: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a940: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a950: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a960: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a980: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a990: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a9a0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a9b0: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a9c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a9d0: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a9e0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a9f0: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
aa00: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
aa10: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
aa20: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
aa30: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
aa40: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
aa50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aa60: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
aa70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
aa80: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
aa90: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
aaa0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
aab0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
aac0: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
aad0: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
aae0: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
aaf0: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
ab00: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
ab10: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
ab20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
ab30: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
ab40: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
ab50: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
ab60: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
ab70: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
ab80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab90: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
aba0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
abb0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
abc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
abd0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
abe0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
abf0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
ac00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ac10: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
ac20: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
ac30: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
ac40: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
ac50: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
ac60: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
ac70: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
ac80: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
ac90: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
aca0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
acb0: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
acc0: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
acd0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
ace0: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
acf0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
ad00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
ad10: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
ad20: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
ad30: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
ad40: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
ad50: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ad60: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
ad70: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
ad80: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
ad90: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
ada0: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
adb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
adc0: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
add0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
ade0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
adf0: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
ae00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ae10: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
ae20: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
ae30: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
ae40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ae50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ae60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ae70: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ae80: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ae90: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
aea0: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
aeb0: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
aec0: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
aed0: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
aee0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
aef0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
af00: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
af10: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
af20: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
af30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
af40: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
af50: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
af60: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
af70: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
af80: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
af90: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
afa0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
afb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
afc0: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
afd0: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
afe0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
aff0: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
b000: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
b010: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
b020: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
b030: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
b040: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
b050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b070: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b080: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
b0a0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
b0b0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
b0c0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
b0d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
b0e0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
b0f0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
b100: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
b110: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
b120: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
b130: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
b140: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
b150: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
b160: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
b170: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
b180: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
b190: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
b1a0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
b1b0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
b1c0: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
b1d0: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
b1e0: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
b1f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
b200: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
b210: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
b220: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b230: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b240: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b250: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b260: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b270: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
b280: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
b290: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b2a0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b2b0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
b2c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b2d0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
b2e0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b2f0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
b300: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b310: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
b320: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
b330: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
b340: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
b350: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b360: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
b370: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
b380: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
b390: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
b3a0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
b3b0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b3c0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
b3d0: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
b3e0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
b3f0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
b400: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b410: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
b420: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
b430: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
b440: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
b450: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
b460: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
b470: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
b480: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
b490: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
b4a0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
b4b0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
b4c0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
b4d0: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
b4e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
b4f0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
b500: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
b510: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b520: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b530: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b540: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
b550: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
b560: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b570: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
b580: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
b590: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b5a0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b5b0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b5c0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b5d0: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
b5e0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
b5f0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b600: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
b610: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
b620: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
b630: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
b640: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
b650: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
b670: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
b680: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
b690: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
b6a0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
b6b0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
b6c0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
b6d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
b6e0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
b6f0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
b700: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
b710: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
b720: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
b730: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
b740: 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20  leaf;.    top = 
b750: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b760: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b770: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
b780: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b790: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
b7a0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
b7b0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
b7c0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
b7d0: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
b7e0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
b7f0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
b800: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
b810: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b820: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
b830: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
b840: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
b850: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
b860: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
b870: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
b880: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
b890: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
b8a0: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
b8b0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
b8c0: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
b8d0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
b8e0: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
b8f0: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
b900: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
b910: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
b920: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
b930: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
b940: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
b950: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
b960: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
b970: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
b980: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
b990: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b9a0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
b9b0: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
b9c0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
b9d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b9e0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
b9f0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
ba00: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ba20: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
ba30: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ba40: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
ba50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
ba60: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
ba70: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
ba80: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
ba90: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
baa0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
bab0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bac0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
bad0: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
bae0: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
baf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
bb00: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
bb10: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
bb20: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bb30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bb40: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bb50: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bb60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
bb70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bb80: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
bb90: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
bba0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
bbb0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
bbc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
bbd0: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
bbe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bbf0: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
bc00: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bc10: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bc20: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bc30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bc40: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bc50: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
bc60: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
bc70: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
bc80: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
bc90: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
bca0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
bcb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bcc0: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
bcd0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
bce0: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
bcf0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
bd00: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
bd10: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bd20: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bd30: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
bd40: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
bd50: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
bd60: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
bd70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bd80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
bda0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bdb0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
bdc0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
bdd0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
bde0: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
bdf0: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
be00: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
be10: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
be20: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
be30: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
be40: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
be50: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
be60: 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d  of..** the free-
be70: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
be80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
be90: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
bea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
beb0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
bed0: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
bee0: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
bef0: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
bf00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
bf10: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
bf20: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
bf30: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
bf40: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
bf50: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
bf60: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
bf70: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
bf80: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
bf90: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bfa0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
bfb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
bfc0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
bfd0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
bfe0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
bff0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c000: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c010: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c020: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c030: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c040: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c050: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c060: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c070: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c080: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c090: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c0a0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c0b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c0d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c0e0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c0f0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c100: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c110: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c120: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c130: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c140: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c150: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c160: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c170: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c180: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
c190: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
c1a0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
c1b0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
c1c0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
c1d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c1e0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
c1f0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
c200: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
c210: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
c220: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c230: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
c240: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c250: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c260: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c270: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c280: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c290: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c2a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c2b0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
c2c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c2d0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c2e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c2f0: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
c300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c310: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c320: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c330: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c340: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c350: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
c360: 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
c370: 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  lete ){.    mems
c380: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
c390: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c3a0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
c3b0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
c3c0: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
c3d0: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
c3e0: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
c3f0: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
c400: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c410: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c420: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c430: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c440: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c450: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c460: 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61  nFree = pBt->usa
c470: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b  bleSize - first;
c480: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
c490: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
c4a0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c4b0: 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d   = hdr;.  pPage-
c4c0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
c4d0: 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  rst;.  pPage->nO
c4e0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
c4f0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
c500: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
c510: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
c520: 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
c530: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
c540: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c550: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
c560: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
c570: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
c580: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
c590: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
c5a0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
c5b0: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
c5c0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
c5d0: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
c5e0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
c5f0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
c600: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
c610: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
c620: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
c630: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
c640: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
c650: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
c660: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
c670: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
c680: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
c690: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c6a0: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
c6b0: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
c6c0: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
c6d0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
c6e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c6f0: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
c700: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
c710: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
c720: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
c730: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
c740: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
c750: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
c760: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
c770: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
c780: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
c790: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
c7a0: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
c7b0: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
c7c0: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
c7d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
c7e0: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
c7f0: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
c800: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
c810: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
c820: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
c830: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
c840: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
c850: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
c860: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
c870: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
c880: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
c890: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
c8a0: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
c8b0: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
c8c0: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
c8d0: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
c8e0: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
c8f0: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
c900: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c910: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
c920: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
c930: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
c940: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
c950: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
c960: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
c970: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
c980: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
c990: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
c9a0: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
c9b0: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
c9c0: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
c9d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
c9e0: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
c9f0: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
ca00: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
ca10: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
ca20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ca30: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
ca40: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
ca50: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
ca60: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
ca70: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
ca80: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
ca90: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
caa0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
cab0: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
cac0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
cad0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
cae0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
caf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
cb00: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
cb10: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
cb20: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
cb30: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
cb40: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
cb50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
cb60: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
cb70: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
cb80: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
cb90: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
cba0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
cbb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
cbc0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
cbd0: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
cbe0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
cbf0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
cc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cc10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cc20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cc30: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
cc40: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
cc50: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
cc60: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
cc70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
cc80: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
cc90: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
cca0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
ccb0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
ccc0: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
ccd0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
cce0: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
ccf0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
cd00: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
cd10: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
cd20: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
cd30: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
cd40: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
cd50: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
cd60: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
cd70: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
cd80: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
cd90: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
cda0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
cdb0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
cdc0: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
cdd0: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
cde0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
cdf0: 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f  (int)btreePageco
ce00: 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
ce10: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
ce20: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
ce30: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
ce40: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
ce50: 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f   is just a.** co
ce60: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
ce70: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
ce80: 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  e calls to btree
ce90: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a  GetPage() and .*
cea0: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
ceb0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  )..**.** If an e
cec0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
ced0: 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50  n the value *ppP
cee0: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73  age is set to is
cef0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
cf00: 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
cf10: 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
cf20: 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
cf30: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
cf40: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
cf50: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
cf60: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
cf70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
cf80: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
cf90: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
cfa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cfb0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
cfc0: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
cfd0: 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57  *ppPage     /* W
cfe0: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
cff0: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b  inter here */.){
d000: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
d010: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d020: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d030: 65 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  ex) );..  if( pg
d040: 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
d050: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63  t(pBt) ){.    rc
d060: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
d070: 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
d080: 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
d090: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
d0a0: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
d0b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d0c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
d0d0: 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
d0e0: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
d0f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d100: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
d110: 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
d120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d130: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
d140: 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
d150: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
d160: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
d170: 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
d180: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
d190: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
d1a0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
d1b0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
d1c0: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
d1d0: 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
d1e0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
d1f0: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
d200: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
d210: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
d220: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d230: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
d240: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d250: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
d260: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
d270: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
d280: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
d290: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
d2a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d2b0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d2c0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
d2d0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
d2e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d2f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d300: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d310: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
d320: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
d330: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
d340: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
d350: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
d360: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
d370: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
d380: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
d390: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
d3a0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
d3b0: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
d3c0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
d3d0: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
d3e0: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
d3f0: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
d400: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d410: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
d420: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
d430: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
d440: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
d450: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
d460: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
d470: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
d480: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
d490: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
d4a0: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
d4b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
d4c0: 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
d4d0: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
d4e0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
d4f0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
d500: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
d510: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
d520: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
d530: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
d540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d550: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d560: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d570: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
d580: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
d590: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
d5a0: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
d5b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
d5c0: 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
d5d0: 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
d5e0: 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
d5f0: 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
d600: 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
d610: 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
d620: 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
d630: 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
d640: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
d650: 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
d660: 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
d670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d680: 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
d690: 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
d6a0: 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
d6b0: 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
d6c0: 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
d6d0: 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
d6e0: 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
d6f0: 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
d700: 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
d710: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
d720: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
d730: 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
d740: 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
d750: 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
d760: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
d770: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
d780: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
d790: 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
d7a0: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
d7b0: 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
d7c0: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
d7d0: 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
d7e0: 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
d7f0: 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
d800: 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
d810: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d820: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d830: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d840: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
d850: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d860: 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
d870: 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
d880: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
d890: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
d8a0: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
d8b0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
d8c0: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
d8d0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
d8e0: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
d8f0: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
d900: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
d910: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
d920: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
d930: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
d940: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
d950: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
d960: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66  is called..** If
d970: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
d980: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
d990: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
d9a0: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
d9b0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
d9c0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
d9d0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
d9e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
d9f0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
da00: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
da10: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
da20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
da30: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
da40: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
da50: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
da60: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
da70: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
da80: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
da90: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
daa0: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
dab0: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
dac0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
dad0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
dae0: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
daf0: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
db00: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
db10: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
db20: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
db30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
db40: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
db50: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
db60: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
db70: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
db80: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
db90: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
dba0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
dbb0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
dbc0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
dbd0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
dbe0: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
dbf0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
dc00: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
dc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
dc20: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
dc30: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
dc40: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
dc50: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
dc60: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
dc70: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
dc80: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
dc90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
dca0: 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
dcb0: 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74  is btree */.  Bt
dcc0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dce0: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
dcf0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
dd00: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
dd30: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
dd40: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
dd50: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
dd60: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
dd70: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
dd80: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
dd90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dda0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
ddb0: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
ddc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
ddd0: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
de00: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
de10: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
de20: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
de30: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
de40: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
de50: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74  ent */..  /* Set
de60: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
de70: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
de80: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
de90: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
dea0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
deb0: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
dec0: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
ded0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
dee0: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
def0: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
df00: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
df10: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
df20: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
df30: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
df40: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
df50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
df60: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
df70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
df80: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
df90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
dfa0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
dfb0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
dfc0: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
dfd0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
dfe0: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
dff0: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
e000: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
e010: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
e020: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
e030: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e040: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e050: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e060: 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d  );..  pVfs = db-
e070: 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c  >pVfs;.  p = sql
e080: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
e090: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
e0a0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
e0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e0c0: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
e0d0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
e0e0: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
e0f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e100: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e110: 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
e120: 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
e130: 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
e140: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
e150: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
e160: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
e170: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e180: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
e190: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
e1a0: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
e1b0: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
e1c0: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
e1d0: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
e1e0: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
e1f0: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
e200: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
e210: 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20   if( isMemdb==0 
e220: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  && zFilename && 
e230: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
e240: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
e250: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
e260: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
e270: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
e280: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
e290: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
e2a0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e2b0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
e2c0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
e2d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
e2e0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e2f0: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
e300: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
e310: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
e320: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
e330: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e340: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
e350: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e370: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e380: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
e390: 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e  name, nFullPathn
e3a0: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
e3b0: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  me);.      mutex
e3c0: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
e3d0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
e3e0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
e3f0: 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
e400: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e410: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
e420: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
e430: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e440: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e450: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
e460: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e470: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
e480: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
e490: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
e4a0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
e4b0: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
e4c0: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
e4d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e4e0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
e4f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
e500: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
e510: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
e520: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
e530: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
e540: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
e550: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
e560: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
e570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e580: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
e590: 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
e5a0: 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
e5b0: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
e5c0: 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
e5d0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
e5e0: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
e5f0: 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
e600: 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
e610: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
e620: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
e630: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e640: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
e650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
e660: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e670: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
e680: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e690: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e6a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e6b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
e6d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
e6e0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
e6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e700: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
e710: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
e720: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
e730: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e740: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e750: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e760: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
e770: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
e780: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e790: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e7a0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
e7b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
e7c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
e7d0: 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
e7e0: 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
e7f0: 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
e800: 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
e810: 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
e820: 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
e830: 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
e840: 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
e850: 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
e860: 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
e870: 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
e880: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
e890: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
e8a0: 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
e8b0: 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
e8c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
e8d0: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
e8e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
e8f0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
e900: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
e910: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
e920: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
e930: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
e940: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
e950: 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
e960: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
e970: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
e980: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
e990: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
e9a0: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
e9b0: 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
e9c0: 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
e9d0: 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
e9e0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e9f0: 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(i64)==8 || siz
ea00: 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(i64)==4 );. 
ea10: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
ea20: 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(u64)==8 || siz
ea30: 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(u64)==4 );. 
ea40: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
ea50: 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
ea60: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
ea70: 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
ea80: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
ea90: 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
eaa0: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
eab0: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
eac0: 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
ead0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
eae0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
eaf0: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
eb00: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
eb10: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
eb20: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
eb30: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
eb40: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
eb70: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
eb80: 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74  lags, pageReinit
eb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
eba0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ebb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ebc0: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
ebd0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
ebe0: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
ebf0: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
ec00: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
ec10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ec20: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
ec30: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
ec40: 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
ec50: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
ec60: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
ec70: 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
ec80: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
ec90: 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
eca0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
ecb0: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
ecc0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
ecd0: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
ece0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69  >readOnly = sqli
ecf0: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
ed00: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ly(pBt->pPager);
ed10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
ed20: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
ed30: 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
ed40: 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  te = 1;.#endif. 
ed50: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
ed60: 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
ed70: 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
ed80: 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
ed90: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
eda0: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
edb0: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
edc0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
edd0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
ede0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
edf0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
ee00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
ee10: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
ee20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ee30: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
ee40: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
ee50: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
ee60: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
ee70: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
ee80: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
ee90: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
eea0: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
eeb0: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
eec0: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
eed0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
eee0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
eef0: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
ef00: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
ef10: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
ef20: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
ef30: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
ef40: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
ef50: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
ef60: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
ef70: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
ef80: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
ef90: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
efa0: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
efb0: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
efc0: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
efd0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
efe0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
eff0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
f000: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
f010: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
f020: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
f030: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
f040: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
f050: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
f060: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
f070: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
f080: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
f090: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
f0a0: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
f0b0: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
f0c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f0d0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f0e0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
f0f0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
f100: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
f110: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
f120: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
f130: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
f140: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
f150: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
f160: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
f170: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
f180: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
f190: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
f1a0: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
f1b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f1c0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f1d0: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
f1e0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
f1f0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
f200: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
f210: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
f220: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
f230: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
f240: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
f250: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
f260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
f270: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
f280: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f290: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
f2a0: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
f2b0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
f2c0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
f2d0: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
f2e0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
f2f0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
f300: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f310: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
f320: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
f330: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
f340: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
f350: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
f360: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
f370: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
f380: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
f390: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
f3a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
f3b0: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
f3c0: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
f3d0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f3e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f3f0: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
f400: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
f410: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
f420: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f430: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
f440: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
f450: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f460: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f480: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f490: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
f4a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f4b0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
f4c0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f4d0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f4e0: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
f4f0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f500: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f510: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
f520: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f530: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
f540: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
f550: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
f560: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f570: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f580: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f590: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f5a0: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
f5b0: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
f5c0: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
f5d0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
f5e0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
f5f0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
f600: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
f610: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
f620: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
f630: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
f640: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f650: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
f660: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
f670: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f680: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
f690: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
f6a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f6b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f6c0: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
f6d0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
f6e0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
f6f0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
f700: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
f710: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
f720: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
f730: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
f740: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f750: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
f760: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f770: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
f780: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
f790: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
f7a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
f7b0: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
f7c0: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
f7d0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
f7e0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
f7f0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f810: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
f820: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f830: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
f840: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
f850: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
f860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
f870: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
f880: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f890: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
f8a0: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
f8b0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
f8c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f8d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
f8e0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
f8f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
f900: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f910: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
f920: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
f930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
f940: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
f950: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
f960: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
f970: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f980: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
f990: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
f9a0: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
f9b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
f9c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f9d0: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
f9e0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f9f0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
fa00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
fa10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
fa20: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
fa30: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
fa40: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
fa50: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
fa60: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
fa70: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
fa80: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
fa90: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
faa0: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
fab0: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
fac0: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
fad0: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
fae0: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
faf0: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
fb00: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
fb10: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
fb20: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
fb30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb40: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
fb50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
fb60: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
fb70: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
fb80: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
fb90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fba0: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
fbb0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
fbc0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
fbd0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fbe0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fbf0: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
fc00: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
fc10: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
fc20: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
fc30: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
fc40: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
fc50: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fc60: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
fc70: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
fc80: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fc90: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fca0: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
fcb0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
fcc0: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
fcd0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fce0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fcf0: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
fd00: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
fd10: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
fd20: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
fd30: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
fd40: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
fd50: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
fd60: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
fd70: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
fd80: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
fd90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fda0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
fdb0: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
fdc0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
fdd0: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
fde0: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
fdf0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
fe00: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
fe10: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
fe20: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
fe30: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
fe40: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
fe50: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
fe60: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
fe70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
fe80: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
fe90: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
fea0: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
feb0: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
fec0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
fed0: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
fee0: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
fef0: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
ff00: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
ff10: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
ff20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
ff30: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
ff40: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
ff50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
ff60: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
ff70: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
ff80: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
ff90: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
ffa0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
ffb0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
ffc0: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
ffd0: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
ffe0: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
fff0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10000 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
10010 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
10020 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10030 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
10040 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
10050 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
10060 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
10070 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10090 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
100a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
100b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
100c0 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
100d0 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
100e0 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
100f0 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
10100 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
10110 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
10120 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
10130 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
10140 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
10150 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
10160 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
10170 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
10180 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
10190 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
101a0 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
101b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
101c0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
101d0 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
101e0 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
101f0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
10200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
10210 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
10220 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10230 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
10240 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
10250 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
10260 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
10270 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
10280 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
10290 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
102a0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
102b0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
102c0 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
102d0 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
102e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
102f0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
10300 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
10310 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
10320 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
10330 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
10340 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
10350 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
10360 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
10370 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
10380 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
10390 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
103a0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
103b0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
103c0 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
103d0 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
103e0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
103f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
10400 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
10410 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
10420 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
10430 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
10440 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
10450 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
10460 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
10470 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
10480 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
10490 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
104a0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
104b0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
104c0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
104d0 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
104e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
104f0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
10500 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
10510 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
10520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
10530 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
10540 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
10550 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
10560 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
10570 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
10580 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
10590 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
105a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
105b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
105c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
105d0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
105e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
105f0 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
10600 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
10610 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
10620 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
10630 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
10640 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
10650 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
10660 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
10670 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
10680 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
10690 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
106a0 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
106b0 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
106c0 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
106d0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
106e0 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
106f0 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
10700 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
10710 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
10720 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
10730 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
10740 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
10750 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
10760 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
10770 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
10780 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
10790 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
107a0 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
107b0 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
107c0 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
107d0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
107e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
107f0 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
10800 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
10810 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
10820 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
10830 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
10840 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
10850 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
10860 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
10870 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
10880 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10890 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
108a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
108b0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
108c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
108d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
108e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
108f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
10900 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10910 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
10920 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
10930 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
10940 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
10950 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10970 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10980 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
10990 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
109a0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
109b0 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
109c0 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
109d0 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
109e0 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
109f0 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
10a00 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
10a10 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
10a20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
10a30 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
10a40 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
10a50 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
10a60 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
10a70 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
10a80 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
10a90 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
10aa0 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
10ab0 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
10ac0 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
10ad0 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
10ae0 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
10af0 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
10b00 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
10b10 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
10b20 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
10b30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10b40 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
10b50 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
10b60 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
10b70 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
10b80 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
10b90 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
10ba0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
10bb0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
10bc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10bd0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
10be0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10bf0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
10c00 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
10c10 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65  Level(pBt->pPage
10c20 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79  r, level, fullSy
10c30 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nc);.  sqlite3Bt
10c40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10c70 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10c80 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
10c90 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
10ca0 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
10cb0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
10cc0 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
10cd0 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
10ce0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
10cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10d00 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
10d10 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
10d20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10d30 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
10d40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10d50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
10d60 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
10d70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10d80 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
10d90 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
10da0 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
10db0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
10dc0 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
10dd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10de0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10df0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
10e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10e10 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
10e20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
10e30 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
10e40 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10e50 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
10e60 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
10e70 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
10e80 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
10e90 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
10ea0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
10eb0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
10ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
10ed0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
10ee0 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
10ef0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
10f00 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
10f10 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
10f20 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
10f30 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
10f40 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
10f50 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
10f60 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
10f70 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
10f80 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
10f90 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
10fa0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
10fb0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
10fc0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
10fd0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
10fe0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
10ff0 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
11000 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
11010 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
11020 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
11030 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
11040 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
11050 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
11060 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
11070 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
11080 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
11090 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
110a0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
110b0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
110c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
110d0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
110e0 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
110f0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
11100 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
11110 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69  n the pageSizeFi
11120 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  xed flag is set 
11130 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
11140 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
11150 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
11160 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
11170 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
11180 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
11190 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
111a0 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
111b0 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
111c0 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
111d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
111e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
111f0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11200 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
11210 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
11220 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11230 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
11240 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
11250 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
11260 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11270 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11280 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
11290 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
112a0 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
112b0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
112c0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
112d0 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
112e0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
112f0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
11300 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
11310 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
11320 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
11330 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
11340 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
11350 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
11360 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
11370 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
11380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
11390 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
113a0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
113b0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
113c0 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
113d0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
113e0 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
113f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11400 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
11410 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
11420 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
11430 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
11440 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
11450 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
11460 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
11470 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69  ix ) pBt->pageSi
11480 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73  zeFixed = 1;.  s
11490 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
114a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
114b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
114c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
114d0 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
114e0 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
114f0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
11500 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
11510 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
11520 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
11530 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
11540 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
11550 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
11560 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
11570 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
11580 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
11590 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
115a0 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
115b0 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
115c0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
115d0 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
115e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
115f0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
11600 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
11610 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11620 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
11630 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
11640 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
11650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11660 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11670 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
11680 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
11690 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
116a0 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
116b0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
116c0 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
116d0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
116e0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
116f0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
11700 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
11710 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
11720 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
11730 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
11740 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
11750 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
11760 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
11770 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
11780 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11790 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
117a0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
117b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
117c0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
117d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
117e0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
117f0 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 75 72  ** Set the secur
11800 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69 66 20  eDelete flag if 
11810 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
11820 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
11830 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
11840 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
11850 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
11860 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
11870 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20 73  ecureDelete.** s
11880 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65  etting after the
11890 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20   change..*/.int 
118a0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
118b0 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
118c0 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
118d0 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
118e0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
118f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11900 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e  nter(p);.  if( n
11910 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
11920 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44   p->pBt->secureD
11930 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c 61 67  elete = (newFlag
11940 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20  !=0) ? 1 : 0;.  
11950 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74 2d  } .  b = p->pBt-
11960 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b 0a 20  >secureDelete;. 
11970 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11980 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11990 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  b;.}.#endif /* !
119a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
119b0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
119c0 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
119d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
119e0 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
119f0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
11a00 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
11a10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
11a20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
11a30 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
11a40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
11a50 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
11a60 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
11a70 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
11a80 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
11a90 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
11aa0 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
11ab0 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
11ac0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
11ad0 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
11ae0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
11af0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
11b00 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
11b10 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
11b20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
11b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
11b40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11b60 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
11b70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11b80 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11b90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11ba0 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
11bb0 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
11bc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11bd0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
11be0 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61  eSizeFixed && (a
11bf0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
11c00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
11c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
11c20 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
11c30 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
11c40 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
11c50 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11c60 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
11c70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11c80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11c90 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
11ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11cb0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11cc0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
11cd0 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
11ce0 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
11cf0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
11d00 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
11d10 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
11d20 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
11d30 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
11d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11d50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
11d60 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
11d70 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
11d80 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
11d90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11da0 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
11db0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
11dc0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
11dd0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
11de0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
11df0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
11e00 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
11e10 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
11e20 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
11e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11e40 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11e50 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
11e60 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
11e70 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
11e80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11e90 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
11ea0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
11eb0 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
11ec0 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
11ed0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11ee0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
11ef0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
11f00 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
11f10 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
11f20 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
11f30 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
11f40 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
11f50 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
11f60 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11f70 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
11f80 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
11f90 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
11fa0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
11fb0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
11fc0 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
11fd0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
11fe0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11ff0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12000 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
12010 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
12020 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
12030 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
12040 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
12050 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
12060 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12070 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
12080 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
12090 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
120a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
120b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
120c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
120d0 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
120e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
120f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
12100 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
12110 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
12120 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12130 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
12140 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12150 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
12160 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
12170 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
12180 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
12190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
121a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
121b0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
121c0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
121d0 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
121e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
121f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
12200 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
12210 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
12220 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
12230 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
12240 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
12250 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
12260 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
12270 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
12280 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
12290 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
122a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
122b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
122c0 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
122d0 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
122e0 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
122f0 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
12300 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12310 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
12320 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
12330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
12340 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  e>0 ){.    int p
12350 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  ageSize;.    int
12360 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
12370 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
12380 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
12390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
123a0 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
123b0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
123c0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
123d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
123e0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
123f0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
12400 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
12410 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12420 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
12430 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12440 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12450 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
12460 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12470 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
12480 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
12490 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
124a0 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
124b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
124c0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29  f( page1[19]>2 )
124d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
124e0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
124f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12500 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69   the write versi
12510 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20  on is set to 2, 
12520 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68  this database sh
12530 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64  ould be accessed
12540 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d  .    ** in WAL m
12550 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20  ode. If the log 
12560 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
12570 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  pen, open it now
12580 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72  . Then .    ** r
12590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
125a0 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f  and return witho
125b0 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74  ut populating Bt
125c0 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20  Shared.pPage1.. 
125d0 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
125e0 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e   detects this an
125f0 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  d calls this fun
12600 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69  ction again. Thi
12610 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  s is.    ** requ
12620 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73  ired as the vers
12630 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75  ion of page 1 cu
12640 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
12650 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20  age1 buffer.    
12660 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68  ** may not be th
12670 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
12680 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   - there may be 
12690 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74  a newer one in t
126a0 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69  he log.    ** fi
126b0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
126c0 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20  f( page1[19]==2 
126d0 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55 73 65  && pBt->doNotUse
126e0 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  WAL==0 ){.      
126f0 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
12700 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12710 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
12720 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
12730 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
12740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12750 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
12760 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12770 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12780 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
12790 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
127a0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
127b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
127c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
127d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
127e0 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
127f0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
12800 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
12810 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
12820 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
12830 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
12840 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
12850 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
12860 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
12870 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
12880 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
12890 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
128a0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
128b0 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
128c0 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
128d0 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
128e0 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
128f0 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
12900 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
12910 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
12920 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
12930 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
12940 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12950 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12960 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
12970 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
12980 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
12990 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
129a0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
129b0 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
129c0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
129d0 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
129e0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
129f0 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
12a00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12a10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
12a20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
12a30 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
12a40 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
12a50 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
12a60 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
12a70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
12a80 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
12a90 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
12aa0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
12ab0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12ac0 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
12ad0 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
12ae0 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
12af0 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
12b00 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
12b10 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
12b20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
12b30 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
12b40 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
12b50 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
12b60 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
12b70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
12b80 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
12b90 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
12ba0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
12bb0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
12bc0 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
12bd0 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
12be0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12bf0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
12c00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
12c10 20 28 75 33 32 29 75 73 61 62 6c 65 53 69 7a 65   (u32)usableSize
12c20 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
12c30 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
12c40 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
12c50 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
12c60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12c70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
12c80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
12c90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
12ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
12cd0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
12ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12cf0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 48 65  .    if( nPageHe
12d00 61 64 65 72 3e 6e 50 61 67 65 46 69 6c 65 20 29  ader>nPageFile )
12d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
12d20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12d30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
12d40 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12d50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
12d60 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
12d70 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
12d80 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
12d90 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
12da0 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
12db0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
12dc0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 33  usableSize = (u3
12dd0 32 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  2)usableSize;.#i
12de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12df0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
12e00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
12e10 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
12e20 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
12e30 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
12e40 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
12e50 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
12e60 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
12e70 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
12e80 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
12e90 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
12ea0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
12eb0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
12ec0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
12ed0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
12ee0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
12ef0 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
12f00 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
12f10 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
12f20 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
12f30 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
12f40 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
12f50 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
12f60 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
12f70 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
12f80 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
12f90 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
12fa0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
12fb0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
12fc0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
12fd0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
12fe0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
12ff0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
13000 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
13010 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
13020 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
13030 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
13040 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
13050 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
13060 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
13070 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
13080 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
13090 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
130a0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
130b0 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
130c0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
130d0 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
130e0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
130f0 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
13100 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
13110 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13120 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
13130 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
13140 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
13150 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
13160 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
13170 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
13180 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74  5 - 23;.  assert
13190 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
131a0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
131b0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
131c0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
131d0 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
131e0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
131f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
13200 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13210 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
13220 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
13230 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
13240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13250 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
13260 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
13270 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
13280 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
13290 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
132a0 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
132b0 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
132c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
132d0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
132e0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
132f0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
13300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13310 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
13320 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
13330 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
13340 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
13350 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
13360 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
13370 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
13380 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
13390 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
133a0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
133b0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
133c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
133d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
133e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
133f0 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
13400 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  r==0 || pBt->inT
13410 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
13420 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
13430 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13440 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
13450 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
13460 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13470 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
13480 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
13490 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
134a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
134b0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
134c0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
134d0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
134e0 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
134f0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
13500 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
13510 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
13520 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
13530 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
13540 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
13550 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
13560 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
13570 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
13580 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
13590 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
135a0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
135b0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
135c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
135d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
135e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
135f0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
13600 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
13610 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13620 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
13630 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
13640 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13660 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
13670 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
13680 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
13690 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
136a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
136b0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
136c0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
136d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
136e0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
136f0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
13700 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
13710 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13720 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
13730 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
13740 3d 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  = (pBt->pageSize
13750 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 64 61 74  >>8)&0xff;.  dat
13760 61 5b 31 37 5d 20 3d 20 28 70 42 74 2d 3e 70 61  a[17] = (pBt->pa
13770 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
13780 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
13790 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
137a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
137b0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
137c0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
137d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
137e0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
137f0 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
13800 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
13810 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
13820 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
13830 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
13840 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
13850 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
13860 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
13870 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
13880 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
13890 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
138a0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
138b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
138c0 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
138d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
138e0 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
138f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13900 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
13910 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
13920 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
13930 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
13940 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
13950 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
13960 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
13970 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
13980 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
13990 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
139a0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
139b0 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
139c0 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
139d0 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
139e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
139f0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
13a00 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
13a10 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
13a20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
13a30 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
13a40 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13a50 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
13a60 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
13a70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
13a80 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
13a90 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
13aa0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
13ab0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
13ac0 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
13ad0 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
13ae0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
13af0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
13b00 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
13b10 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
13b20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
13b30 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
13b40 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
13b50 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
13b60 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
13b70 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
13b80 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
13b90 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
13ba0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
13bb0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
13bc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
13bd0 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
13be0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
13bf0 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
13c00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
13c10 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
13c20 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
13c30 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
13c40 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
13c50 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
13c60 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
13c70 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
13c80 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
13c90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
13ca0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
13cb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13cc0 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
13cd0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13ce0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
13cf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13d00 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
13d10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
13d20 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
13d30 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
13d40 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
13d50 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
13d60 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
13d70 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
13d80 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
13d90 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
13da0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
13db0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
13dc0 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
13dd0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
13de0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
13df0 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
13e00 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
13e10 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
13e20 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
13e30 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
13e40 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
13e50 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
13e60 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
13e70 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
13e80 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13e90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
13ea0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
13eb0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
13ec0 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
13ed0 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
13ee0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
13ef0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
13f00 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
13f10 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
13f20 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
13f30 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
13f40 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
13f50 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
13f60 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
13f70 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
13f80 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
13f90 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
13fa0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
13fb0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
13fc0 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
13fd0 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
13fe0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
13ff0 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
14000 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
14010 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
14020 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
14030 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
14040 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
14050 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
14060 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
14070 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
14080 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14090 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
140a0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
140b0 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
140c0 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
140d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
140e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
140f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14100 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14110 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
14120 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
14130 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
14140 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
14150 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14160 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
14170 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
14180 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
14190 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
141a0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
141b0 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
141c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
141d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
141e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
141f0 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
14200 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
14210 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
14220 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
14230 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
14240 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
14250 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
14260 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
14270 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ase */.  if( pBt
14280 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
14290 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
142a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
142b0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
142c0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
142d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
142e0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
142f0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
14300 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
14310 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
14320 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
14330 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
14340 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
14350 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
14360 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
14370 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
14380 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
14390 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
143a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
143b0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
143c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
143d0 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
143e0 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20  >isPending ){.  
143f0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
14400 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
14410 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
14420 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
14430 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
14440 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
14450 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
14460 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
14470 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
14480 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
14490 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
144a0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
144b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
144c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144d0 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
144e0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
144f0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
14500 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
14510 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
14520 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
14530 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
14540 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
14550 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
14560 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
14570 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14580 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
14590 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
145a0 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
145b0 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
145c0 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
145d0 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
145e0 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
145f0 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
14600 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
14610 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
14620 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
14630 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
14640 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
14650 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
14660 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
14670 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
14680 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79    pBt->initially
14690 45 6d 70 74 79 20 3d 20 28 75 38 29 28 70 42 74  Empty = (u8)(pBt
146a0 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a 20 20 64  ->nPage==0);.  d
146b0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
146c0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
146d0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
146e0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
146f0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
14700 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
14710 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
14720 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
14730 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
14740 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
14750 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
14760 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
14770 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
14780 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
14790 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
147a0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
147b0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
147c0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
147d0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
147e0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
147f0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
14800 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
14810 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
14820 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
14830 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
14840 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
14850 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
14860 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
14870 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
14880 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
14890 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
148a0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
148b0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
148c0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
148d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
148e0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
148f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14910 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
14920 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
14930 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
14940 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
14950 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14970 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
14980 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
14990 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
149a0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
149b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
149c0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
149d0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
149e0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
149f0 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
14a00 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
14a10 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
14a20 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
14a30 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
14a40 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
14a50 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
14a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14a70 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
14a80 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
14a90 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
14aa0 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
14ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14ac0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
14ad0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14ae0 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
14af0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
14b00 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
14b10 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
14b20 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
14b30 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
14b40 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
14b50 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
14b60 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
14b70 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
14b80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
14b90 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
14ba0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
14bb0 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
14bc0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
14bd0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
14be0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
14bf0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14c00 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
14c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14c20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
14c30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
14c40 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
14c50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14c60 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
14c80 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
14c90 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
14ca0 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
14cb0 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
14cc0 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a  (u8)(wrflag>1);.
14cd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
14ce0 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
14cf0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
14d00 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
14d10 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
14d20 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
14d30 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
14d40 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
14d50 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
14d60 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
14d70 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
14d80 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
14d90 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
14da0 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
14db0 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
14dc0 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
14dd0 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
14de0 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
14df0 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
14e00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
14e10 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
14e20 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
14e30 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
14e40 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
14e50 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
14e60 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
14e70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
14e90 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
14ea0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
14eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
14ed0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
14ee0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
14ef0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
14f00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14f10 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
14f20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14f30 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
14f40 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
14f50 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
14f60 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
14f70 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
14f80 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
14f90 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
14fa0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
14fb0 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
14fc0 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
14fd0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
14fe0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
14ff0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
15000 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
15010 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
15020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15030 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
15040 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
15050 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
15060 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
15070 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
15080 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15090 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
150a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
150b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
150c0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
150d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
150e0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
150f0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
15100 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
15110 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
15120 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
15130 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
15140 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
15150 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
15160 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
15170 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
15180 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
15190 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
151a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
151b0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
151e0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
151f0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15220 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
15230 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15260 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
15270 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15280 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
15290 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
152a0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
152b0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
152c0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
152d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
152e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
152f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
15300 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
15310 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
15320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15330 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
15340 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
15350 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
15360 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
15370 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
15380 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
15390 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
153a0 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
153b0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
153c0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
153d0 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
153e0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
153f0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
15400 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
15410 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
15420 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
15430 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
15440 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
15450 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
15460 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15470 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
15480 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
15490 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
154a0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
154b0 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
154c0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
154d0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
154e0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
154f0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
15500 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
15510 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
15520 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
15530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
15540 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
15550 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
15560 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
15570 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
15580 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
15590 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
155a0 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
155b0 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
155c0 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
155d0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
155e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
155f0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
15600 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
15610 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
15620 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
15630 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
15650 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
15660 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
15670 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
15680 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
15690 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
156a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
156d0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
156e0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
156f0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
15700 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
15710 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
15720 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
15730 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
15740 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
15750 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
15760 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
15770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15780 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
15790 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
157a0 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
157b0 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
157c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
157d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
157e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
157f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
15800 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
15810 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
15820 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
15830 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
15840 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
15850 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
15860 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
15870 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
15880 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
15890 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
158a0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
158b0 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
158c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
158d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
158e0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
158f0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
15900 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
15910 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
15920 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
15930 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
15940 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
15950 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50  ..    btreeInitP
15960 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
15970 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
15980 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
15990 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
159a0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
159b0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
159c0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
159d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
159e0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
159f0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
15a00 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72  nfo;.        btr
15a10 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
15a20 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
15a30 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
15a40 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
15a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15a60 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
15a70 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
15a80 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
15a90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
15aa0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
15ab0 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
15ac0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15af0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
15b00 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
15b10 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
15b20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
15b30 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
15b40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15b50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15b60 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
15b70 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
15b80 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
15b90 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
15ba0 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
15bb0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
15bc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
15bd0 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
15be0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15bf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
15c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15c10 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
15c20 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
15c30 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
15c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
15c50 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
15c60 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
15c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15c80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
15c90 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
15ca0 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
15cb0 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
15cc0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
15cd0 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
15ce0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
15cf0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
15d00 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
15d10 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
15d20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
15d30 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
15d40 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
15d50 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
15d60 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
15d70 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
15d80 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
15d90 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
15da0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
15db0 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
15dc0 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
15dd0 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
15de0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15df0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
15e00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
15e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
15e20 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
15e30 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
15e40 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
15e50 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
15e60 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
15e70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
15e80 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
15e90 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
15ea0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
15eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
15ec0 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
15ed0 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
15ee0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
15ef0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
15f00 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
15f10 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
15f20 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
15f30 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
15f40 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
15f50 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
15f60 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
15f70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
15f80 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
15f90 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
15fa0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
15fb0 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
15fc0 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
15fd0 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
15fe0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
15ff0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
16000 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16010 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
16020 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
16030 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
16040 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
16050 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
16060 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
16070 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
16080 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
16090 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
160a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
160b0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
160c0 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
160d0 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
160e0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
160f0 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
16100 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
16110 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
16120 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
16130 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
16140 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
16150 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
16160 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
16170 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
16180 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
16190 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
161a0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
161b0 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
161c0 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
161d0 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
161e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
161f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16200 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
16210 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
16220 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
16230 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
16240 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
16250 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
16260 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
16270 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
16280 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
16290 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
162a0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
162b0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
162c0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
162d0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
162e0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
162f0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
16300 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
16310 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
16320 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
16330 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
16340 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
16350 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
16360 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
16370 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
16380 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
16390 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
163a0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
163b0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
163c0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
163d0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
163e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
163f0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
16400 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
16410 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
16420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16430 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16440 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
16450 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
16460 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
16470 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
16480 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
16490 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
164a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
164b0 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
164c0 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
164d0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
164e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
164f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
16500 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
16510 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16520 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
16530 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
16540 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
16550 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
16560 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
16570 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
16580 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
16590 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
165a0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
165b0 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
165c0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
165d0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
165e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
165f0 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
16600 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
16610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16640 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
16650 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
16660 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
16670 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16690 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
166a0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
166b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
166c0 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
166d0 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
166e0 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
166f0 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
16700 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16710 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
16720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16730 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
16740 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
16750 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
16760 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
16770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16780 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
16790 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
167a0 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
167b0 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
167c0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
167d0 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
167e0 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
167f0 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
16800 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
16810 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
16820 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
16830 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
16840 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
16850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
16860 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
16870 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
16880 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
16890 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
168a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
168b0 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
168c0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
168d0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
168e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
168f0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
16900 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
16910 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
16920 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
16930 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
16940 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
16950 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
16960 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
16970 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
16980 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
16990 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
169a0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
169b0 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
169c0 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
169d0 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
169e0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
169f0 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
16a00 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
16a10 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
16a20 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
16a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
16a40 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
16a50 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
16a60 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20  ss is complete. 
16a70 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
16a80 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
16a90 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63 75  that.** incrVacu
16aa0 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62 65  umStep() will be
16ab0 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74 65   called a finite
16ac0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73   amount of times
16ad0 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f 72  .** which may or
16ae0 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20 74   may not empty t
16af0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41 20  he freelist.  A 
16b00 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d 0a  full autovacuum.
16b10 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20 20  ** has nFin>0.  
16b20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65 6d  A "PRAGMA increm
16b30 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68 61  ental_vacuum" ha
16b40 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74  s nFin==0..*/.st
16b50 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
16b60 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
16b70 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
16b80 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b  , Pgno iLastPg){
16b90 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
16ba0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
16bb0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
16bc0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
16bd0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
16be0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
16bf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16c00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16c10 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
16c20 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
16c30 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
16c40 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
16c50 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
16c60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16c70 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
16c80 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
16c90 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
16ca0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
16cb0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
16cc0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
16cd0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
16ce0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
16cf0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
16d00 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
16d10 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
16d20 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
16d30 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
16d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16d50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16d70 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
16d80 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
16d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16da0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
16db0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
16dc0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
16dd0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  E ){.      if( n
16de0 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Fin==0 ){.      
16df0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
16e00 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
16e10 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
16e20 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
16e30 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
16e40 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65  f nFin is non-ze
16e50 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
16e60 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
16e70 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
16e80 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
16e90 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
16ea0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
16eb0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
16ec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
16ed0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
16ee0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
16ef0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
16f00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16f10 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
16f20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
16f30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
16f40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
16f50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
16f60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
16f70 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20   iLastPg, 1);.  
16f80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16fa0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16fc0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
16fd0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
16fe0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16ff0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
17000 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
17010 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
17020 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
17030 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
17040 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
17050 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
17060 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
17070 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  tPg;..      rc =
17080 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
17090 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
170a0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
170b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
170c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
170d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
170e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
170f0 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
17100 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
17110 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
17120 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
17130 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
17140 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
17150 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
17160 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
17170 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17180 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
17190 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
171a0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
171b0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
171c0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
171d0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
171e0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
171f0 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
17200 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
17210 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
17220 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17230 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
17240 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
17250 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
17260 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
17270 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
17280 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
17290 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
172a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
172b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
172c0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
172d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
172e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
172f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17300 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
17310 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
17320 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
17330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17340 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
17350 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
17360 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17370 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e  rWrite(pLastPg->
17380 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
173a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
173b0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
173c0 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
173d0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
173e0 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b  reePg, nFin!=0);
173f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
17400 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
17410 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
17420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17440 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
17450 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e  .  }..  if( nFin
17460 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74  ==0 ){.    iLast
17470 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28  Pg--;.    while(
17480 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
17490 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
174a0 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ||PTRMAP_ISPAGE(
174b0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
174c0 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41  .      if( PTRMA
174d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
174e0 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
174f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a    MemPage *pPg;.
17500 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
17510 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
17520 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29  LastPg, &pPg, 0)
17530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17550 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17560 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
17570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17580 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
17590 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
175a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
175b0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
175c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
175d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
175e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
175f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17600 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
17610 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
17620 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
17630 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73  Bt->pPager, iLas
17640 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  tPg);.    pBt->n
17650 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
17660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17670 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17680 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
17690 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
176a0 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
176b0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
176c0 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
176d0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
176e0 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
176f0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
17700 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
17710 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
17720 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
17730 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
17740 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
17750 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
17760 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
17770 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
17780 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
17790 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
177a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
177b0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
177c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
177d0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
177e0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
177f0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
17800 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
17810 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17820 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
17830 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
17840 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
17850 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
17860 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
17870 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
17880 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
17890 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
178a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
178b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
178c0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
178d0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
178e0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
178f0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20  uumStep(pBt, 0, 
17900 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
17910 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Bt));.    if( rc
17920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17930 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17940 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
17950 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
17960 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
17970 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
17980 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
17990 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nPage);.    }.  
179a0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
179b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
179c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
179d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
179e0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
179f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
17a00 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
17a10 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
17a20 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
17a30 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
17a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
17a50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17a60 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
17a70 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
17a80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
17a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17aa0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
17ab0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
17ac0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
17ad0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
17ae0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
17af0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
17b00 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
17b10 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
17b20 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
17b30 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
17b40 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
17b50 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
17b60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
17b70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
17b80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
17b90 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
17ba0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
17bb0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
17bc0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
17bd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17be0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17bf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
17c00 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
17c10 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
17c20 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
17c30 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
17c40 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
17c50 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
17c60 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
17c70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17c80 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
17c90 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
17ca0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
17cb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17cc0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
17cd0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
17ce0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
17cf0 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
17d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
17d10 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
17d20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
17d30 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
17d40 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
17d50 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
17d60 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20      int nEntry; 
17d70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17d80 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
17d90 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
17da0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
17db0 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
17dc0 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
17dd0 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
17de0 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
17df0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
17e00 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
17e10 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
17e20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
17e30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
17e40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
17e50 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
17e60 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
17e70 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
17e80 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
17e90 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
17ea0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
17eb0 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
17ec0 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
17ed0 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
17ee0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
17ef0 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
17f00 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
17f10 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
17f20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17f30 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
17f40 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
17f50 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
17f60 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45  ata[36]);.    nE
17f70 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
17f80 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50  leSize/5;.    nP
17f90 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
17fa0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
17fb0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
17fc0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
17fd0 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
17fe0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
17ff0 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  p;.    if( nOrig
18000 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
18010 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
18020 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18030 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
18040 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
18050 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
18060 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
18070 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
18080 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18090 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
180a0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  -;.    }.    if(
180b0 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
180c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
180d0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66  UPT_BKPT;..    f
180e0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
180f0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
18100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
18110 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
18120 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
18130 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
18140 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
18150 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
18160 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
18170 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
18180 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
18190 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
181a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
181b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
181c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
181d0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
181e0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
181f0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
18200 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
18210 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
18220 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
18230 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
18240 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18250 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
18260 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  t->pPager, nFin)
18270 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
18280 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
18290 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
182a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
182b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
182c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
182d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
182e0 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
182f0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
18300 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
18310 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
18320 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
18330 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
18340 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
18350 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
18360 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
18370 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18380 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
18390 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
183a0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
183b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
183c0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
183d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
183e0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
183f0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
18400 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
18410 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
18420 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
18430 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
18440 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
18450 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18460 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
18470 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
18480 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
18490 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
184a0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
184b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
184c0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
184d0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
184e0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
184f0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
18500 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
18510 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
18520 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
18530 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
18540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18550 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
18560 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
18570 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
18580 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
18590 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
185a0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
185b0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
185c0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
185d0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
185e0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
185f0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
18600 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
18610 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
18620 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
18630 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
18640 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
18650 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
18660 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
18670 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
18680 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
18690 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
186a0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
186b0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
186c0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
186d0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
186e0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
186f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
18700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18710 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
18720 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
18730 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
18740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
18750 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
18760 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
18770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
18780 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
18790 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
187a0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
187b0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
187c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
187d0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
187e0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
187f0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
18800 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
18810 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
18820 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
18830 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
18840 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
18850 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
18860 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
18870 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
18880 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
18890 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
188a0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
188b0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
188c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
188d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
188e0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
188f0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
18900 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18910 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
18920 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18930 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
18940 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18950 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
18960 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
18970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18980 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18990 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
189a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
189b0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
189c0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
189d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
189e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
189f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18a00 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
18a10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18a20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
18a30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18a40 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
18a50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
18a60 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
18a70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18a80 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
18a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
18aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
18ab0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
18ac0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18ad0 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
18ae0 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
18af0 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
18b00 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
18b10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18b20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
18b30 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
18b40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18b50 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
18b60 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
18b70 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
18b80 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
18b90 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
18ba0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
18bb0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e  RANS_NONE && p->
18bc0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
18bd0 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  t>1 ){.    /* If
18be0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
18bf0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
18c00 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
18c10 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
18c20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
18c30 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
18c40 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
18c50 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
18c60 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
18c70 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
18c80 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
18c90 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
18ca0 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
18cb0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
18cc0 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
18cd0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
18ce0 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
18cf0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
18d00 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
18d10 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
18d20 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
18d30 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
18d40 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
18d50 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
18d60 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
18d70 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
18d80 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
18d90 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
18da0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
18db0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
18dc0 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
18dd0 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
18de0 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
18df0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
18e00 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
18e10 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
18e20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
18e30 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
18e40 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
18e50 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
18e60 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
18e70 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
18e80 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
18e90 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
18ea0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
18eb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
18ec0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
18ed0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
18ee0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
18ef0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
18f00 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
18f10 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
18f20 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
18f30 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
18f40 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
18f50 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
18f60 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
18f70 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
18f80 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
18f90 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
18fa0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
18fb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
18fc0 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
18fd0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
18fe0 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
18ff0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
19000 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
19010 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
19020 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
19030 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
19040 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
19050 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
19060 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
19070 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
19080 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
19090 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
190a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
190b0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
190c0 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
190d0 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
190e0 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
190f0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
19100 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
19110 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
19120 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
19130 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
19140 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
19150 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
19160 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
19170 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
19180 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
19190 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
191a0 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
191b0 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
191c0 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
191d0 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
191e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
191f0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
19200 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
19210 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19220 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
19230 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
19240 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
19250 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
19260 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
19270 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
19280 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
19290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
192a0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
192b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
192c0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
192d0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
192e0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
192f0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19300 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
19310 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
19320 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
19330 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
19340 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
19350 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
19360 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
19370 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19380 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
19390 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
193a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
193b0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
193c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
193d0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
193e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
193f0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
19400 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
19410 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19420 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19440 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
19450 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
19460 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
19470 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
19480 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
19490 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
194a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
194b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
194c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
194d0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
194e0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
194f0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
19500 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
19510 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
19520 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
19530 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
19540 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
19550 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
19560 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
19570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
19580 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19590 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
195a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
195b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
195c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
195d0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
195e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
195f0 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
19600 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
19610 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
19620 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
19630 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
19640 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
19650 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
19660 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
19670 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
19680 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
19690 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
196a0 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
196b0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
196c0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
196d0 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
196e0 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
196f0 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
19700 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
19710 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
19720 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
19730 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
19740 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
19750 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
19760 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
19770 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
19780 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
19790 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
197a0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
197b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
197c0 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
197d0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
197e0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
197f0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
19800 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
19810 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
19820 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
19830 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
19840 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
19850 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
19860 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
19870 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
19880 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
19890 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
198a0 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
198b0 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
198c0 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
198d0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
198e0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
198f0 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
19900 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
19910 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
19920 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
19930 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
19940 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
19950 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
19960 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
19970 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19980 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
19990 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
199a0 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
199b0 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
199c0 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
199d0 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
199e0 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
199f0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
19a00 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
19a10 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
19a20 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
19a30 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
19a40 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
19a50 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
19a60 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
19a70 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
19a80 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
19a90 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
19aa0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
19ab0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
19ac0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19ad0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
19ae0 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
19af0 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
19b00 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
19b10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19b20 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
19b30 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
19b40 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
19b50 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
19b60 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
19b70 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
19b80 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
19b90 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
19ba0 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e  LT;.    p->skipN
19bb0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
19bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
19bd0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
19be0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
19bf0 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
19c00 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
19c10 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
19c20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
19c30 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d  Leave(pBtree);.}
19c40 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
19c50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19c60 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
19c70 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
19c80 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
19c90 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
19ca0 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
19cb0 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
19cc0 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
19cd0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
19ce0 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
19cf0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
19d00 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
19d10 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
19d20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
19d30 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
19d40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
19d50 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
19d60 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
19d70 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
19d80 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
19d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19da0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
19db0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
19dc0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19dd0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
19de0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
19df0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19e00 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
19e10 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
19e20 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  t, 0, 0);.#ifnde
19e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
19e40 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
19e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19e60 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
19e70 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75   a horrible situ
19e80 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20  ation. An IO or 
19e90 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
19ea0 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20  ccurred whilst. 
19eb0 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20     ** trying to 
19ec0 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69  save cursor posi
19ed0 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
19ee0 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72  s an automatic r
19ef0 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20  ollback (as.    
19f00 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
19f10 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d   a constraint, m
19f20 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
19f30 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65  or IO error) the
19f40 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  n .    ** the ca
19f50 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72  che may be inter
19f60 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
19f70 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  nt (not contain 
19f80 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a  valid trees) so.
19f90 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
19fa0 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74   simply return t
19fb0 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  he error to the 
19fc0 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c  caller. Instead,
19fd0 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61   abort .    ** a
19fe0 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20  ll queries that 
19ff0 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79  may be using any
1a000 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
1a010 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73  that failed to s
1a020 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ave..    */.    
1a030 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1a040 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63  AllCursors(p, rc
1a050 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1a060 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a070 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
1a080 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a090 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
1a0a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
1a0b0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
1a0c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1a0d0 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
1a0e0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1a0f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1a100 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
1a110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1a120 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
1a130 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
1a140 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
1a150 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
1a160 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
1a170 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
1a180 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
1a190 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
1a1a0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
1a1b0 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
1a1c0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
1a1d0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
1a1e0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1a1f0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
1a200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a210 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
1a220 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
1a230 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1a240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a250 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
1a260 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1a270 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1a280 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1a290 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1a2a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
1a2b0 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
1a2c0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1a2d0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
1a2e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1a2f0 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
1a300 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
1a310 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
1a320 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
1a330 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1a340 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
1a350 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1a360 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1a370 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a380 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a390 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1a3a0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1a3b0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1a3c0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1a3d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
1a3e0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
1a3f0 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
1a400 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
1a410 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
1a420 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
1a430 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
1a440 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1a450 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1a460 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
1a470 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
1a480 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1a490 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
1a4a0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
1a4b0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
1a4c0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
1a4d0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
1a4e0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
1a4f0 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
1a500 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
1a510 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
1a520 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
1a530 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
1a540 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
1a550 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
1a560 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
1a570 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
1a580 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
1a590 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
1a5a0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1a5b0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
1a5c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1a5d0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
1a5e0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
1a5f0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1a600 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
1a610 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
1a620 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1a630 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1a640 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
1a650 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
1a660 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
1a670 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
1a680 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1a690 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
1a6a0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
1a6b0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1a6c0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
1a6d0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
1a6e0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
1a6f0 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
1a700 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
1a710 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
1a720 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
1a730 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
1a740 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
1a750 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1a760 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
1a770 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1a780 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1a790 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
1a7a0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
1a7b0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1a7c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a7d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a7e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1a7f0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
1a800 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1a810 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
1a820 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
1a830 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1a840 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1a850 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
1a860 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
1a870 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a880 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a890 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1a8a0 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
1a8b0 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
1a8c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1a8d0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
1a8e0 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
1a8f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
1a900 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
1a910 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
1a920 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
1a930 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
1a940 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
1a950 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
1a960 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
1a970 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
1a980 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
1a990 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1a9a0 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
1a9b0 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
1a9c0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1a9d0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1a9e0 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
1a9f0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1aa00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1aa10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1aa20 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1aa30 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
1aa40 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
1aa50 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
1aa60 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
1aa70 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1aa80 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1aa90 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
1aaa0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
1aab0 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
1aac0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
1aad0 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
1aae0 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
1aaf0 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
1ab00 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
1ab10 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
1ab20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ab30 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
1ab40 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
1ab50 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
1ab60 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
1ab70 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
1ab80 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
1ab90 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
1aba0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1abb0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1abc0 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
1abd0 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
1abe0 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
1abf0 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
1ac00 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
1ac10 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
1ac20 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
1ac30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
1ac40 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
1ac50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
1ac60 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
1ac70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
1ac80 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
1ac90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1aca0 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
1acb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1acc0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1acd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ace0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
1acf0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
1ad00 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
1ad10 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
1ad20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
1ad30 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
1ad40 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
1ad50 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
1ad60 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
1ad70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1ad80 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
1ad90 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
1ada0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1adb0 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
1adc0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1add0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ade0 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
1adf0 74 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e 69 74  t<0 && pBt->init
1ae00 69 61 6c 6c 79 45 6d 70 74 79 20 29 20 70 42 74  iallyEmpty ) pBt
1ae10 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
1ae20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1ae30 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1ae40 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
1ae50 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
1ae60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1ae70 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
1ae80 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1ae90 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1aea0 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
1aeb0 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
1aec0 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
1aed0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
1aee0 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
1aef0 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
1af00 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
1af10 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
1af20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1af30 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
1af40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1af50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1af60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1af70 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1af80 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
1af90 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
1afa0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
1afb0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
1afc0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1afd0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1afe0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1aff0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
1b000 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
1b010 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
1b020 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
1b030 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
1b040 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
1b050 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
1b060 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1b070 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
1b080 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
1b090 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
1b0a0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b0b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
1b0c0 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
1b0d0 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
1b0e0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1b0f0 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
1b100 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
1b110 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
1b120 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
1b130 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
1b140 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
1b150 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
1b160 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
1b170 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
1b180 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
1b190 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
1b1a0 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
1b1b0 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
1b1c0 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
1b1d0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
1b1e0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
1b1f0 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
1b200 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
1b210 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1b220 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
1b230 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
1b240 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
1b250 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
1b260 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
1b270 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
1b280 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
1b290 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
1b2a0 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
1b2b0 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
1b2c0 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
1b2d0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
1b2e0 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
1b2f0 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
1b300 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
1b310 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
1b320 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
1b330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1b340 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
1b350 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
1b360 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
1b370 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
1b380 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
1b390 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
1b3a0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
1b3b0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
1b3c0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
1b3d0 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
1b3e0 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
1b3f0 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
1b400 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
1b410 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1b420 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1b430 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
1b440 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1b450 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
1b460 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1b470 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
1b480 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
1b490 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
1b4a0 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
1b4b0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
1b4c0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
1b4d0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1b4e0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
1b4f0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
1b500 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b530 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1b540 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b560 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1b570 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1b580 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1b5b0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1b5c0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1b5d0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1b5e0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1b5f0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1b600 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
1b610 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
1b620 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
1b650 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
1b660 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b670 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
1b680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1b690 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
1b6a0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1b6b0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1b6c0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
1b6d0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1b6e0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
1b6f0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1b700 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
1b710 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
1b720 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
1b730 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
1b740 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
1b750 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
1b760 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
1b770 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
1b780 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
1b790 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
1b7a0 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
1b7b0 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
1b7c0 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
1b7d0 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
1b7e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
1b7f0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1b800 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1b810 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72   pKeyInfo!=0, wr
1b820 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73  Flag+1) );.  ass
1b830 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1b840 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
1b850 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
1b860 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
1b870 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1b880 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
1b890 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
1b8a0 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
1b8b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1b8c0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
1b8d0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1b8e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1b8f0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1b900 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
1b910 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
1b920 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66  ->aData );..  if
1b930 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26  ( NEVER(wrFlag &
1b940 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29  & pBt->readOnly)
1b950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b960 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1b970 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
1b980 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65  ==1 && btreePage
1b990 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
1b9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b9b0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20  TE_EMPTY;.  }.. 
1b9c0 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
1b9d0 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
1b9e0 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
1b9f0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
1ba00 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
1ba10 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
1ba20 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
1ba30 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
1ba40 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
1ba50 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
1ba60 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
1ba70 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
1ba80 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
1ba90 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
1baa0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
1bab0 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
1bac0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20   pCur->wrFlag = 
1bad0 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43  (u8)wrFlag;.  pC
1bae0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
1baf0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
1bb00 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1bb10 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1bb20 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
1bb30 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
1bb40 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
1bb50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1bb60 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72  _INVALID;.  pCur
1bb70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1bb80 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
1bb90 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
1bba0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1bbb0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bbe0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1bbf0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1bc30 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1bc40 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1bc70 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1bc80 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1bc90 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1bca0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1bcb0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1bcc0 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
1bcd0 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
1bce0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
1bd10 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
1bd20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1bd30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bd40 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
1bd50 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
1bd60 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
1bd70 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
1bd80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1bd90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1bda0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1bdb0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
1bdc0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1bdd0 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
1bde0 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
1bdf0 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
1be00 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
1be10 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
1be20 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
1be30 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
1be40 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
1be50 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1be60 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
1be70 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
1be80 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
1be90 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
1bea0 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
1beb0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1bec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bed0 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
1bee0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
1bef0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
1bf00 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
1bf10 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
1bf20 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
1bf30 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1bf40 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1bf50 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
1bf60 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
1bf70 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
1bf80 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
1bf90 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
1bfa0 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
1bfb0 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
1bfc0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
1bfd0 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
1bfe0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
1bff0 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
1c000 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
1c010 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
1c020 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
1c030 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
1c040 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
1c050 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
1c060 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c070 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1c080 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
1c090 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
1c0a0 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
1c0b0 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a   iPage));.}../*.
1c0c0 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65  ** Set the cache
1c0d0 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66  d rowid value of
1c0e0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e   every cursor in
1c0f0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
1c100 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43  se file.** as pC
1c110 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68  ur and having th
1c120 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1c130 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e   number as pCur.
1c140 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a    The value is.*
1c150 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e  * set to iRowid.
1c160 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69  .**.** Only posi
1c170 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65  tive rowid value
1c180 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1c190 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20   valid for this 
1c1a0 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61  cache..** The ca
1c1b0 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  che is initializ
1c1c0 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69  ed to zero, indi
1c1d0 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69  cating an invali
1c1e0 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74  d cache..** A bt
1c1f0 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  ree will work fi
1c200 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20  ne with zero or 
1c210 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e  negative rowids.
1c220 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74    We just cannot
1c230 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f  .** cache zero o
1c240 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1c250 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  s, which means t
1c260 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a  ables that use z
1c270 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69  ero or.** negati
1c280 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20  ve rowids might 
1c290 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
1c2a0 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61  wer.  But in pra
1c2b0 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ctice, zero.** o
1c2c0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1c2d0 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d  s are very uncom
1c2e0 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75  mon so this shou
1c2f0 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ld not be a prob
1c300 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
1c310 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
1c320 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1c330 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f   *pCur, sqlite3_
1c340 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  int64 iRowid){. 
1c350 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1c360 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d  for(p=pCur->pBt-
1c370 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1c380 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1c390 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70  ( p->pgnoRoot==p
1c3a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20  Cur->pgnoRoot ) 
1c3b0 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  p->cachedRowid =
1c3c0 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61   iRowid;.  }.  a
1c3d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63  ssert( pCur->cac
1c3e0 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64  hedRowid==iRowid
1c3f0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
1c400 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72  urn the cached r
1c410 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76  owid for the giv
1c420 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65  en cursor.  A ne
1c430 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a  gative or zero.*
1c440 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1c450 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1c460 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73  e rowid cache is
1c470 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
1c480 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65  uld be.** ignore
1c490 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64  d.  If the rowid
1c4a0 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72   cache has never
1c4b0 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74   before been set
1c4c0 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f  , then a.** zero
1c4d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1c4e0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1c4f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61  qlite3BtreeGetCa
1c500 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1c510 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1c520 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64  urn pCur->cached
1c530 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1c540 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
1c550 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
1c560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c570 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
1c580 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
1c590 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
1c5a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c5b0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
1c5c0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
1c5d0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
1c5e0 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
1c5f0 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
1c600 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1c610 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c620 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
1c630 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c640 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1c650 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1c660 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
1c670 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72     if( pCur->pPr
1c680 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ev ){.      pCur
1c690 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1c6a0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1c6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1c6c0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1c6d0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1c6e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1c6f0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Next ){.      pC
1c700 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1c710 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
1c720 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1c730 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
1c740 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1c750 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1c760 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1c770 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
1c780 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1c790 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
1c7a0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
1c7b0 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  r);.    /* sqlit
1c7c0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
1c7d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1c7e0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1c7f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c800 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c810 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1c820 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
1c830 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1c840 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
1c850 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
1c860 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
1c870 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
1c880 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
1c890 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1c8a0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1c8b0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1c8c0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1c8d0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1c8e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1c8f0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1c900 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1c910 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1c920 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
1c930 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
1c940 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
1c950 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
1c960 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
1c970 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
1c980 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
1c990 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
1c9a0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
1c9b0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
1c9c0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
1c9d0 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
1c9e0 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
1c9f0 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
1ca00 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
1ca10 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
1ca20 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
1ca30 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
1ca40 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
1ca50 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1ca60 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
1ca70 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
1ca80 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
1ca90 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
1caa0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
1cab0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
1cac0 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
1cad0 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
1cae0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
1caf0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
1cb00 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1cb10 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
1cb20 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1cb30 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1cb40 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
1cb50 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
1cb60 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
1cb70 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1cb80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1cb90 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
1cba0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
1cbb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
1cbc0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
1cbd0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
1cbe0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
1cbf0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
1cc00 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
1cc10 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
1cc20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
1cc30 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1cc40 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
1cc50 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
1cc60 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
1cc70 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
1cc80 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
1cc90 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1cca0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1ccb0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
1ccc0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1ccd0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1cce0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1ccf0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1cd00 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1cd10 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1cd20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
1cd30 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1cd40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cd50 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1cd60 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1cd70 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
1cd80 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
1cd90 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
1cda0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
1cdb0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
1cdc0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
1cdd0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
1cde0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1cdf0 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1ce30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1ce40 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
1ce80 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1ce90 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1ced0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1cee0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1cef0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1cf00 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1cf10 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
1cf20 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
1cfc0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1cfd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
1d010 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
1d020 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  */..#ifndef NDEB
1d030 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
1d040 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
1d050 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1d060 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1d070 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1d080 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
1d090 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
1d0a0 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
1d0b0 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
1d0c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1d0d0 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
1d0e0 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
1d0f0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
1d100 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
1d110 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
1d120 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1d130 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1d140 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1d150 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1d160 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
1d170 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
1d180 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
1d190 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d1a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
1d1b0 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  EBUG */../*.** S
1d1c0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
1d1d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
1d1e0 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
1d1f0 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
1d200 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
1d210 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
1d220 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1d230 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
1d240 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
1d250 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
1d260 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
1d270 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
1d280 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
1d290 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
1d2a0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1d2b0 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
1d2c0 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
1d2d0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
1d2e0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
1d2f0 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f  ler must positio
1d300 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69  n the cursor pri
1d310 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1d320 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
1d330 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d340 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49   cannot fail.  I
1d350 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
1d360 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f   SQLITE_OK.  .*/
1d370 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d380 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
1d390 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
1d3a0 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1d3b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1d3c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1d3d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1d3e0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1d3f0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1d400 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1d410 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1d420 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
1d430 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65  ID ){.    *pSize
1d440 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1d450 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1d460 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  Cur);.    *pSize
1d470 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1d480 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ey;.  }.  return
1d490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d4a0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1d4b0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1d4c0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
1d4d0 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
1d4e0 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
1d4f0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
1d500 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1d510 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
1d520 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
1d530 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
1d540 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
1d550 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
1d560 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
1d570 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
1d580 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
1d590 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
1d5a0 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
1d5b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d5c0 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65  D..**.** Failure
1d5d0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1d5e0 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
1d5f0 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1d600 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74  SQLITE_OK..** It
1d610 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77   might just as w
1d620 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75  ell be a procedu
1d630 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f  re (returning vo
1d640 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69  id) but we conti
1d650 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e  nue.** to return
1d660 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75   an integer resu
1d670 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74  lt code for hist
1d680 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a  orical reasons..
1d690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d6a0 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
1d6b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1d6c0 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1d6d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d6e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1d6f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1d700 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d710 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
1d720 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
1d730 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1d740 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  nData;.  return 
1d750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d760 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
1d770 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
1d780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1d790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
1d7a0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
1d7b0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1d7c0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
1d7d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1d7e0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
1d7f0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
1d800 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
1d810 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
1d820 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
1d830 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
1d840 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
1d850 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
1d860 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
1d870 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
1d880 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
1d890 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
1d8a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1d8b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1d8c0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
1d8d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1d8e0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
1d8f0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1d900 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
1d910 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
1d920 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
1d930 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
1d940 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
1d950 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
1d960 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
1d970 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
1d980 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
1d990 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
1d9a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
1d9b0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
1d9c0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
1d9d0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
1d9e0 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
1d9f0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
1da00 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1da10 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
1da20 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
1da30 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1da40 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
1da50 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
1da60 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
1da70 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
1da80 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
1da90 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
1daa0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
1dab0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1dac0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
1dad0 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
1dae0 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
1daf0 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
1db00 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
1db10 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
1db20 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
1db30 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1db40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1db50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1db60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
1db90 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1dba0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
1dbb0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
1dbc0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
1dbd0 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
1dbe0 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
1dbf0 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1dc10 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
1dc20 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1dc30 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
1dc40 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1dc50 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
1dc60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dc70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1dc80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dc90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1dca0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
1dcb0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1dcc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1dcd0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
1dce0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
1dcf0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1dd00 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
1dd10 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
1dd20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1dd30 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
1dd40 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1dd50 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
1dd60 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
1dd70 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
1dd80 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
1dd90 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
1dda0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
1ddb0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
1ddc0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
1ddd0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
1dde0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
1ddf0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
1de00 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
1de10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1de20 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
1de30 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
1de40 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
1de50 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
1de60 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1de70 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
1de80 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
1de90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1dea0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
1deb0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
1dec0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
1ded0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1dee0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
1def0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1df00 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
1df10 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
1df20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df30 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
1df40 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
1df50 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
1df60 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
1df70 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
1df80 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1df90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1dfa0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1dfb0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
1dfc0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
1dfd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dfe0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
1dff0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e000 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30   ovfl, &pPage, 0
1e010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
1e020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1e030 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pPage==0 );.    
1e040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e050 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
1e060 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
1e070 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
1e080 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78    }..  *pPgnoNex
1e090 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20  t = next;.  if( 
1e0a0 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  ppPage ){.    *p
1e0b0 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
1e0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65   }else{.    rele
1e0d0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
1e0e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63    }.  return (rc
1e0f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  ==SQLITE_DONE ? 
1e100 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b  SQLITE_OK : rc);
1e110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
1e120 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
1e130 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
1e140 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
1e150 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
1e160 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
1e170 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
1e180 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
1e190 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
1e1a0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
1e1b0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
1e1c0 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
1e1d0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
1e1e0 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
1e1f0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
1e200 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
1e210 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
1e220 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
1e230 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1e240 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
1e250 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
1e260 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
1e270 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
1e280 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
1e290 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
1e2a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e2b0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1e2c0 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
1e2d0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
1e2e0 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
1e2f0 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
1e300 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
1e310 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1e320 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
1e330 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1e340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1e350 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
1e360 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e380 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e390 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
1e3a0 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
1e3b0 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
1e3c0 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
1e3d0 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
1e3e0 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
1e3f0 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
1e400 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
1e410 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
1e420 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
1e430 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1e440 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
1e450 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
1e460 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
1e470 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1e480 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
1e490 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1e4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e4b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e4c0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1e4d0 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
1e4e0 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
1e4f0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1e500 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
1e510 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
1e520 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
1e530 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
1e540 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
1e550 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1e560 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e570 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e580 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
1e590 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
1e5a0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
1e5b0 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
1e5c0 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
1e5d0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1e5e0 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a   to. If the eOp.
1e5f0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
1e600 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61  0, this is a rea
1e610 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74  d operation (dat
1e620 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a  a copied into.**
1e630 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49   buffer pBuf). I
1e640 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
1e650 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20  , a write (data 
1e660 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62  copied from.** b
1e670 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a  uffer pBuf)..**.
1e680 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
1e690 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
1e6a0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
1e6b0 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
1e6c0 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
1e6d0 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
1e6e0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
1e6f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
1e700 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
1e710 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
1e720 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
1e730 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
1e740 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
1e750 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
1e760 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
1e770 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
1e780 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1e790 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e   flag is set, an
1e7a0 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  d the current.**
1e7b0 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
1e7c0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
1e7d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
1e7e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1e7f0 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20  allocates space 
1e800 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
1e810 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
1e820 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1e830 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20  .** cache array 
1e840 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
1e850 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74  low). Subsequent
1e860 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a   calls use this.
1e870 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  ** cache to make
1e880 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
1e890 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
1e8a0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
1e8b0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
1e8c0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e8d0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
1e8e0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61  allocated, it ma
1e8f0 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  y be.** invalida
1e900 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
1e910 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20  r cursor writes 
1e920 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  to the same tabl
1e930 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20  e, or if.** the 
1e940 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
1e950 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  to a different r
1e960 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ow. Additionally
1e970 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  , in auto-vacuum
1e980 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f  .** mode, the fo
1e990 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d  llowing events m
1e9a0 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  ay invalidate an
1e9b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1e9c0 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  ist cache..**.**
1e9d0 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e     * An incremen
1e9e0 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20  tal vacuum,.**  
1e9f0 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61   * A commit in a
1ea00 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c  uto_vacuum="full
1ea10 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43  " mode,.**   * C
1ea20 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  reating a table 
1ea30 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76  (may require mov
1ea40 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ing an overflow 
1ea50 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  page)..*/.static
1ea60 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f   int accessPaylo
1ea70 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
1ea80 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
1ea90 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1eaa0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
1eab0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66  rom */.  u32 off
1eac0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
1ead0 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   Begin reading t
1eae0 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79  his far into pay
1eaf0 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d  load */.  u32 am
1eb00 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
1eb10 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79  * Read this many
1eb20 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
1eb30 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c  gned char *pBuf,
1eb40 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79   /* Write the by
1eb50 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75  tes into this bu
1eb60 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65  ffer */ .  int e
1eb70 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
1eb80 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
1eb90 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
1eba0 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
1ebb0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1ebc0 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
1ebd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
1ebe0 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
1ebf0 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
1ec00 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
1ec10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ec20 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
1ec30 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
1ec40 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
1ec50 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1ec60 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1ec70 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
1ec80 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
1ec90 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
1eca0 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
1ecb0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ecc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ecd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ece0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1ecf0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
1ed00 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
1ed10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ed20 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
1ed30 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1ed40 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1ed50 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b  ur->info.pCell +
1ed60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
1ed70 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70  der;.  nKey = (p
1ed80 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30  Page->intKey ? 0
1ed90 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   : (int)pCur->in
1eda0 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28  fo.nKey);..  if(
1edb0 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d   NEVER(offset+am
1edc0 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
1edd0 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c  nfo.nData) .   |
1ede0 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
1edf0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
1ee00 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
1ee10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
1ee20 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
1ee30 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
1ee40 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
1ee50 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
1ee60 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
1ee70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ee80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1ee90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
1eea0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
1eeb0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
1eec0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
1eed0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
1eee0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
1eef0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1ef00 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1ef10 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
1ef20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1ef30 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
1ef40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1ef50 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
1ef60 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1ef70 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1ef80 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
1ef90 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
1efa0 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
1efb0 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
1efc0 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
1efd0 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
1efe0 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
1eff0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
1f000 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
1f010 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1f020 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
1f030 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
1f040 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
1f050 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
1f060 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
1f070 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
1f080 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
1f090 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1f0a0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1f0b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
1f0c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f0d0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1f0e0 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
1f0f0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1f100 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
1f110 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1f120 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
1f130 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1f140 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
1f150 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
1f160 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
1f170 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
1f180 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
1f190 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1f1a0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
1f1b0 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
1f1c0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
1f1d0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
1f1e0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
1f1f0 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
1f200 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
1f210 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
1f220 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
1f230 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
1f240 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
1f250 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
1f260 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
1f270 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
1f280 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
1f290 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1f2a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
1f2b0 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
1f2c0 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
1f2d0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
1f2e0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
1f2f0 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
1f300 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
1f310 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1f320 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f  Zero(sizeof(Pgno
1f330 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
1f340 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61  /* nOvfl is alwa
1f350 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66  ys positive.  If
1f360 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66   it were zero, f
1f370 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c  etchPayload woul
1f380 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  d have.      ** 
1f390 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61  been used instea
1f3a0 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  d of this routin
1f3b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
1f3c0 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26  ALWAYS(nOvfl) &&
1f3d0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1f3e0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1f3f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1f400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f410 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1f420 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1f430 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1f440 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1f450 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1f460 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1f470 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1f480 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1f490 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1f4a0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1f4b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1f4c0 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1f4d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1f4e0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1f4f0 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1f500 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1f510 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1f520 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1f530 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1f540 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1f550 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1f560 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1f570 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1f580 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1f590 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1f5a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f5b0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1f5c0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1f5d0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1f5e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f5f0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1f600 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1f610 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1f620 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1f630 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1f640 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1f650 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1f660 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1f670 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1f680 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1f690 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1f6a0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1f6b0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1f6c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1f6d0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1f6e0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1f6f0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1f700 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1f710 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1f720 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1f730 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1f740 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1f750 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1f760 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1f770 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1f780 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1f790 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1f7a0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1f7b0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1f7c0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1f7d0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1f7e0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1f7f0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1f800 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1f810 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1f820 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1f830 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1f840 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1f850 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1f860 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1f870 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1f880 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1f890 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f8a0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1f8b0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1f8c0 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1f8d0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1f8e0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1f8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1f900 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1f910 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1f920 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1f930 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1f940 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1f950 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1f960 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1f970 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1f980 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1f990 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1f9a0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1f9b0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1f9c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f9d0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1f9e0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1f9f0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1fa00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1fa10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fa20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1fa30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1fa40 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1fa50 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1fa60 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1fa70 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1fa80 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1fa90 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1faa0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1fab0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1fac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fad0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1fae0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1faf0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1fb00 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1fb10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1fb20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1fb30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fb40 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1fb50 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1fb60 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1fb70 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1fb80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fb90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1fba0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1fbb0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1fbc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1fbd0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1fbe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fbf0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1fc00 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1fc10 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1fc20 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1fc30 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1fc40 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1fc50 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1fc60 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1fc70 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1fc80 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1fc90 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1fca0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
1fcb0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
1fcc0 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
1fcd0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1fce0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1fcf0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
1fd00 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
1fd10 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
1fd20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
1fd30 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
1fd40 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
1fd50 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
1fd60 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
1fd70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fd80 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
1fd90 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1fda0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1fdb0 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
1fdc0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1fdd0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1fde0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1fdf0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1fe00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1fe10 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1fe20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fe30 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
1fe40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1fe50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1fe60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fe70 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1fe80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
1fe90 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
1fea0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
1feb0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
1fec0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
1fed0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1fee0 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
1fef0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1ff00 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1ff10 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1ff20 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1ff30 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1ff40 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1ff50 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1ff60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1ff70 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1ff80 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1ff90 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1ffa0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1ffb0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1ffc0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1ffd0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1ffe0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1fff0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
20000 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20010 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
20020 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
20030 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
20040 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
20050 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
20060 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
20070 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
20080 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
20090 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
200a0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
200b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
200c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
200d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
200e0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
200f0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
20100 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
20110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
20120 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20130 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20140 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
20150 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
20160 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
20170 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
20180 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
20190 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
201a0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
201b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
201c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
201d0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
201e0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
201f0 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
20200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20210 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
20220 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
20230 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
20240 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
20250 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
20260 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
20270 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
20280 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
20290 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
202a0 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
202b0 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
202c0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
202d0 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
202e0 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
202f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
20300 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
20310 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
20320 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
20330 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
20340 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
20350 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
20360 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
20370 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
20380 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
20390 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
203a0 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
203b0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
203c0 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
203d0 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
203e0 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
203f0 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
20400 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
20410 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
20420 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
20430 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
20440 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
20450 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
20460 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
20470 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
20480 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
20490 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
204a0 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
204b0 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
204c0 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
204d0 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
204e0 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
204f0 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
20500 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
20510 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
20520 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
20530 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
20540 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
20550 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
20560 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
20570 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
20580 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
20590 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
205a0 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
205b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
205c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
205d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
205e0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
205f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
20600 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
20610 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
20620 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
20630 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
20640 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
20650 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
20660 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
20670 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
20680 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
20690 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
206a0 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
206b0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
206c0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
206d0 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
206e0 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
206f0 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
20700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
20710 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
20720 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
20730 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20740 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
20750 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20760 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20770 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20780 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20790 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
207a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
207b0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
207c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
207d0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
207e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
207f0 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f  NEVER(pCur->info
20800 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20  .nSize==0) ){.  
20810 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
20820 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
20830 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72  ur->iPage], pCur
20840 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20850 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  age],.          
20860 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e           &pCur->
20870 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61  info);.  }.  aPa
20880 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
20890 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
208a0 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
208b0 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
208c0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
208d0 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
208e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
208f0 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ey = (int)pCur->
20900 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
20910 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
20920 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20      aPayload += 
20930 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  nKey;.    nLocal
20940 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
20950 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d  ocal - nKey;.  }
20960 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c  else{.    nLocal
20970 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
20980 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  ocal;.    assert
20990 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29  ( nLocal<=nKey )
209a0 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  ;.  }.  *pAmt = 
209b0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
209c0 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
209d0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
209e0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
209f0 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
20a00 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
20a10 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
20a20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
20a30 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
20a40 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
20a50 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
20a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
20a70 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
20a80 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
20a90 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
20aa0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
20ab0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
20ac0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
20ad0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
20ae0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
20af0 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
20b00 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
20b10 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
20b20 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
20b30 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
20b40 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
20b50 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
20b60 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
20b70 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
20b80 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
20b90 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
20ba0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
20bb0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
20bc0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
20bd0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
20be0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
20bf0 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
20c00 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
20c10 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
20c20 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
20c30 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
20c40 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
20c50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d   const void *p =
20c60 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
20c70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20c80 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
20c90 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
20ca0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20cb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20cc0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
20cd0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20ce0 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
20cf0 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64   p = (const void
20d00 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
20d10 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
20d20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
20d30 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
20d40 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
20d50 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
20d60 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
20d70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d   const void *p =
20d80 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
20d90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20da0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
20db0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
20dc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20dd0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20de0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
20df0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20e00 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
20e10 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64   p = (const void
20e20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
20e30 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
20e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
20e50 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
20e60 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
20e70 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
20e80 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
20e90 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
20ea0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
20eb0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
20ec0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
20ed0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20ee0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
20ef0 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
20f00 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
20f10 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
20f20 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
20f30 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
20f40 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
20f50 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
20f60 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
20f70 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
20f80 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
20f90 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
20fa0 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
20fb0 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
20fc0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
20fd0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
20fe0 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
20ff0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
21000 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
21010 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
21020 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
21030 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
21040 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
21050 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21060 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21070 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
21080 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
21090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
210a0 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
210b0 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
210c0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
210d0 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
210e0 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
210f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21100 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
21110 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
21120 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
21130 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20  o, &pNewPage);. 
21140 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
21150 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
21160 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
21170 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
21180 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
21190 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
211a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
211b0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
211c0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
211d0 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
211e0 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67  ell<1 || pNewPag
211f0 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  e->intKey!=pCur-
21200 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b  >apPage[i]->intK
21210 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
21220 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21230 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
21240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21250 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
21260 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
21270 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
21280 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
21290 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
212a0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
212b0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
212c0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
212d0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
212e0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
212f0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
21300 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
21310 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
21320 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
21330 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
21340 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
21350 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
21360 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
21370 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
21380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
21390 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
213a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
213b0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
213c0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
213d0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
213e0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
213f0 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
21400 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
21410 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
21420 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
21430 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
21440 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
21450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
21460 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
21470 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
21480 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
21490 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
214a0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
214b0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
214c0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
214d0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
214e0 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
214f0 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
21500 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
21510 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
21520 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
21530 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
21540 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
21550 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
21560 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
21570 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
21580 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
21590 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
215a0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
215b0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
215c0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
215d0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
215e0 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
215f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
21600 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
21610 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21620 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21630 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21640 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21650 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
21660 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
21670 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21680 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
21690 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
216a0 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
216b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
216c0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
216d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
216e0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
216f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21700 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
21710 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
21720 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21730 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75  ->iPage]);.  pCu
21740 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43  r->iPage--;.  pC
21750 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
21760 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
21770 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dNKey = 0;.}../*
21780 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
21790 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
217a0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
217b0 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
217c0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
217d0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
217e0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
217f0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
21800 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
21810 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
21820 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
21830 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
21840 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
21850 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
21860 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
21870 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
21880 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
21890 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
218a0 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
218b0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
218c0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
218d0 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
218e0 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
218f0 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
21900 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
21910 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
21920 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
21930 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
21940 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72  R_INVALID. Other
21950 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  wise, the cursor
21960 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
21970 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
21980 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
21990 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69   the root (or vi
219a0 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
219b0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
219c0 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20  state.** is set 
219d0 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
219e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
219f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
21a00 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
21a10 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
21a20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
21a30 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
21a40 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
21a50 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
21a60 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
21a70 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
21a80 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
21a90 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
21aa0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
21ab0 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
21ac0 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
21ad0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
21ae0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
21af0 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
21b00 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
21b10 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
21b20 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
21b30 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
21b40 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
21b50 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
21b60 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
21b70 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
21b80 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
21b90 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
21ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
21bb0 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
21bc0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
21bd0 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
21be0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21bf0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
21c00 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
21c10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21c20 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
21c30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21c40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21c50 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
21c60 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
21c70 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
21c80 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
21c90 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
21ca0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
21cb0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
21cc0 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
21cd0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
21ce0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
21cf0 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
21d00 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
21d10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21d20 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
21d30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
21d40 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
21d50 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
21d60 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
21d70 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
21d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21d90 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
21da0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
21db0 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
21dc0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
21dd0 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=1; i<=pCur->iP
21de0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
21df0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
21e00 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
21e10 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
21e20 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Page = 0;.  }els
21e30 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
21e40 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
21e50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
21e60 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
21e70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21e90 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
21ea0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
21eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
21ed0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  ->iPage = 0;..  
21ee0 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
21ef0 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
21f00 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
21f10 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
21f20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20  this cursor.    
21f30 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
21f40 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
21f50 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
21f60 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
21f70 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  o is.    ** NULL
21f80 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
21f90 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
21fa0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
21fb0 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
21fc0 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
21fd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
21fe0 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ror.  */.    ass
21ff0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22000 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  e[0]->intKey==1 
22010 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
22020 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  0]->intKey==0 );
22030 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
22040 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43  pKeyInfo==0)!=pC
22050 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
22060 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
22070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22080 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
22090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72  .  }..  /* Asser
220a0 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20  t that the root 
220b0 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20 63  page is of the c
220c0 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68 69  orrect type. Thi
220d0 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20  s must be the.  
220e0 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20 63  ** case as the c
220f0 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
22100 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64  tion that loaded
22110 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28   the root-page (
22120 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73  either.  ** this
22130 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69   call or a previ
22140 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20  ous invocation) 
22150 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
22160 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a  ted corruption .
22170 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75    ** if the assu
22180 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  mption were not 
22190 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20  true, and it is 
221a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
221b0 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a   the flags .  **
221c0 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62 65   byte to have be
221d0 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c  en modified whil
221e0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73  e this cursor is
221f0 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
22200 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ence.  ** to the
22210 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f   page.  */.  pRo
22220 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
22230 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
22240 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
22250 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20  r->pgnoRoot );. 
22260 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
22270 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d  isInit && (pCur-
22280 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70  >pKeyInfo==0)==p
22290 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Root->intKey );.
222a0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
222b0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
222c0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
222d0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
222e0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
222f0 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28  NKey = 0;..  if(
22300 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
22310 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
22320 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
22330 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
22340 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
22350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22360 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
22370 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
22380 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
22390 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
223a0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
223b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
223c0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
223d0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
223e0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
223f0 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
22400 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d  State = ((pRoot-
22410 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
22420 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
22430 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65  VALID);.  }.  re
22440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22450 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22460 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
22470 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
22480 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
22490 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
224a0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
224b0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
224c0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
224d0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
224e0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
224f0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
22500 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
22510 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
22520 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
22530 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
22540 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
22550 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
22560 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
22570 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
22580 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22590 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
225a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
225b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
225c0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
225d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
225e0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
225f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22600 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
22610 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22620 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22630 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
22640 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
22650 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
22660 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
22670 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22680 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
22690 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
226a0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
226b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
226c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
226d0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
226e0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
226f0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
22700 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
22710 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
22720 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
22730 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
22740 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
22750 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
22760 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
22770 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
22780 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
22790 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
227a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
227b0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
227c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
227d0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
227e0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
227f0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
22800 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
22810 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
22820 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
22830 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
22840 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
22850 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
22860 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
22870 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
22880 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
22890 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
228a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
228b0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
228c0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
228d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
228e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
228f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22900 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22910 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
22920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22930 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
22940 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22950 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
22960 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
22970 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
22980 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
22990 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
229a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
229b0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
229c0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
229d0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
229e0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
229f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a00 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
22a10 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
22a20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
22a30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
22a40 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
22a50 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22a60 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
22a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
22a80 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
22a90 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
22aa0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
22ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
22ac0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
22ad0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
22ae0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
22af0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
22b00 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
22b10 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
22b20 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
22b30 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
22b40 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
22b50 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
22b60 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
22b70 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
22b80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22b90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22ba0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22bb0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
22bc0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
22bd0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
22be0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
22bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22c00 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
22c10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
22c20 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
22c30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22c40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22c50 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
22c60 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
22c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22c80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22c90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22ca0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
22cb0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
22cc0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
22cd0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
22ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22cf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
22d00 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
22d10 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
22d20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
22d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
22d40 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
22d50 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
22d60 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
22d70 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
22d80 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
22d90 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
22da0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
22db0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
22dc0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
22dd0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
22de0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
22df0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
22e00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22e10 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22e20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22e30 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22e40 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22e50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
22e60 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
22e70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
22e80 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
22e90 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
22ea0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
22eb0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
22ec0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b   pCur->atLast ){
22ed0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22ee0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
22ef0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
22f00 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
22f10 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
22f20 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
22f30 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
22f40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
22f50 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
22f60 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
22f70 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
22f80 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
22f90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
22fa0 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
22fb0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
22fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22fd0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22fe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
22ff0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23000 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
23010 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
23020 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23030 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
23040 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
23050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23060 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
23070 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
23080 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23090 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
230a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
230b0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
230c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
230d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
230e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
230f0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
23100 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
23110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
23120 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23130 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
23140 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23150 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
23160 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
23170 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
23180 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
23190 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d   ?1:0;.    }.  }
231a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
231b0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
231c0 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
231d0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
231e0 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
231f0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
23200 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
23210 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
23220 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
23230 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
23240 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
23250 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
23260 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
23270 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
23280 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
23290 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
232a0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
232b0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
232c0 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
232d0 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
232e0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
232f0 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
23300 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
23310 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
23320 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
23330 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
23340 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
23350 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
23360 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
23370 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
23380 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
23390 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
233a0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
233b0 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
233c0 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
233d0 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
233e0 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
233f0 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
23400 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
23410 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
23420 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
23430 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
23440 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
23450 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
23460 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
23470 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
23480 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
23490 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
234a0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
234b0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
234c0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
234d0 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
234e0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
234f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23500 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
23510 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
23520 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
23530 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
23540 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
23550 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
23560 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
23570 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
23590 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
235a0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
235b0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
235c0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
235d0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
235e0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
235f0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
23600 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
23610 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
23620 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
23630 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
23640 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
23650 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
23660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
23670 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
23680 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
23690 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
236a0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
236b0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
236c0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
236d0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
236e0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
236f0 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
23700 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
23710 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
23720 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
23730 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
23740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
23750 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
23760 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
23770 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
23780 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23790 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
237a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
237b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
237c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
237d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
237e0 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
237f0 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
23800 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
23810 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
23820 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
23830 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
23840 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
23850 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
23860 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
23870 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
23880 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
23890 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
238a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
238b0 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
238c0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20  r->validNKey .  
238d0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
238e0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
238f0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
23900 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
23910 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
23920 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
23930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23940 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
23950 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72  ->atLast && pCur
23960 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
23970 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
23980 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
23990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
239a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20      }.  }..  rc 
239b0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
239c0 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
239d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
239e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
239f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23a00 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
23a10 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23a20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
23a30 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
23a40 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
23a50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
23a60 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65  ell>0 || pCur->e
23a70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
23a80 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
23a90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23aa0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
23ab0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
23ac0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23ad0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23ae0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
23af0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23b00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
23b10 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23b20 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
23b30 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
23b40 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
23b50 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
23b60 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
23b70 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
23b80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23b90 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
23ba0 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61  t c;..    /* pPa
23bb0 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62  ge->nCell must b
23bc0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
23bd0 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20  ero. If this is 
23be0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
23bf0 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
23c00 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
23c10 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e  INVALID above an
23c20 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c  d this for(;;) l
23c30 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72  oop.    ** not r
23c40 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  un. If this is n
23c50 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ot the root-page
23c60 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54  , then the moveT
23c70 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65  oChild() routine
23c80 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61  .    ** would ha
23c90 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  ve already detec
23ca0 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f  ted db corruptio
23cb0 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50  n. Similarly, pP
23cc0 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  age must.    ** 
23cd0 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e  be the right kin
23ce0 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  d (index or tabl
23cf0 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  e) of b-tree pag
23d00 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  e. Otherwise.   
23d10 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   ** a moveToChil
23d20 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f  d() or moveToRoo
23d30 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68  t() call would h
23d40 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
23d50 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
23d60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
23d70 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61  nCell>0 );.    a
23d80 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
23d90 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d  tKey==(pIdxKey==
23da0 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20  0) );.    lwr = 
23db0 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
23dc0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
23dd0 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29   if( biasRight )
23de0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
23df0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23e00 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20   = (u16)upr;.   
23e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
23e20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23e30 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28  iPage] = (u16)((
23e40 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20  upr+lwr)/2);.   
23e50 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a   }.    for(;;){.
23e60 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20        int idx = 
23e70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23e80 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64  ->iPage]; /* Ind
23e90 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65  ex of current ce
23ea0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20  ll in pPage */. 
23eb0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20       u8 *pCell; 
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
23ee0 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
23ef0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
23f00 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
23f10 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
23f20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
23f30 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
23f40 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
23f50 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
23f60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
23f70 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
23f80 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
23f90 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
23fa0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
23fb0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  u32 dummy;.     
23fc0 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65       pCell += ge
23fd0 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
23fe0 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20   dummy);.       
23ff0 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
24000 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
24010 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
24020 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
24030 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
24040 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
24050 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
24060 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
24070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
24080 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
24090 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
240a0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e  ssert( nCellKey>
240b0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
240c0 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20      c = +1;.    
240d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43      }.        pC
240e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
240f0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
24100 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
24110 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  llKey;.      }el
24120 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
24130 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
24140 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
24150 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
24160 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
24170 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
24180 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
24190 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
241a0 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
241b0 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
241c0 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
241d0 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
241e0 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
241f0 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
24200 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
24210 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
24220 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
24230 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
24240 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
24250 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
24260 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
24270 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
24280 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
24290 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
242a0 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
242b0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
242c0 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
242d0 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
242e0 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
242f0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
24300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
24310 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  nt nCell = pCell
24320 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
24330 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29   !(nCell & 0x80)
24340 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65   && nCell<=pPage
24350 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
24360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
24370 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
24380 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
24390 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
243a0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
243b0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
243c0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
243d0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
243e0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
243f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
24400 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
24410 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
24420 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
24430 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
24440 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
24450 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
24460 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
24470 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
24480 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
24490 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
244a0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
244b0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
244c0 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
244d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
244e0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
244f0 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
24500 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
24510 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
24520 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
24530 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
24540 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
24550 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
24560 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
24570 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
24580 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
24590 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
245a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
245b0 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
245c0 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
245d0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
245e0 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
245f0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
24600 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
24610 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
24620 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
24630 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
24640 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
24650 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
24660 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
24670 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
24680 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
24690 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
246a0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
246b0 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20   be called. */. 
246c0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
246d0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
246e0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
246f0 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
24700 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
24710 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
24720 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
24730 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  tr(pPage, pCellB
24740 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
24750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
24760 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
24770 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
24780 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
24790 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
247a0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Cell );.        
247b0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
247c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
247d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
247e0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
247f0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
24800 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
24810 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
24820 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
24830 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
24840 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
24850 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  llKey, 0);.     
24860 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
24870 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24880 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
24890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
248a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
248b0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
248c0 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
248d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
248e0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
248f0 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
24900 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
24910 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
24920 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24930 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
24940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
24950 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
24960 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
24970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
24980 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
24990 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
249a0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
249b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
249c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  {.          *pRe
249d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
249e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
249f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24a00 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
24a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24a20 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
24a30 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
24a40 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
24a50 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
24a60 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  = idx-1;.      }
24a70 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
24a80 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
24a90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
24aa0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
24ab0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
24ac0 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29  16)((lwr+upr)/2)
24ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
24ae0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
24af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
24b00 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
24b10 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
24b20 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
24b30 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
24b40 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
24b50 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
24b60 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
24b70 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
24b80 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
24b90 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
24ba0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
24bb0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
24bc0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
24bd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
24be0 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
24bf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24c00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24c10 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
24c20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24c30 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ell );.      *pR
24c40 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
24c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24c60 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
24c70 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
24c80 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24c90 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
24ca0 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
24cb0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24cc0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
24cd0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
24ce0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24cf0 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
24d00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
24d10 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
24d20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
24d30 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
24d40 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
24d50 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
24d60 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
24d70 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
24d80 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
24d90 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
24da0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
24db0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
24dc0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
24dd0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
24de0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
24df0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
24e00 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
24e10 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
24e20 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
24e30 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
24e40 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
24e50 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
24e60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
24e70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24e80 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
24e90 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
24ea0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
24eb0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
24ec0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
24ed0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
24ee0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
24ef0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
24f00 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
24f10 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
24f20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
24f30 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
24f40 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
24f50 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
24f60 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
24f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
24f80 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
24f90 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
24fa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
24fb0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
24fc0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
24fd0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
24fe0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
24ff0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
25000 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
25010 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
25020 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
25030 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
25040 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
25050 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25060 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
25070 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
25080 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
25090 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
250a0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
250b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
250c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
250d0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
250e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
250f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
25100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25120 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
25130 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  0 );.  if( CURSO
25140 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
25150 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
25160 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
25170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25180 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
25190 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
251a0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
251b0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
251c0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
251d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
251e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
251f0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
25200 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25210 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
25220 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
25230 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
25240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
25250 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
25260 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e  rt( idx<=pPage->
25270 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
25280 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
25290 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
252a0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
252b0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
252c0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
252d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
252e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
252f0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
25300 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
25310 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
25320 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
25330 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25340 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
25350 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
25360 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25370 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
25380 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
25390 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
253a0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
253b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
253c0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
253d0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
253e0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
253f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25410 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
25420 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
25430 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
25440 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
25450 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
25460 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25470 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
25480 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
25490 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
254a0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
254b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
254c0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
254d0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
254e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
254f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
25500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25510 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
25520 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
25530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25540 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
25550 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
25560 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
25570 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
25580 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
25590 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
255a0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
255b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
255c0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
255d0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
255e0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
255f0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
25600 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
25610 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
25620 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
25630 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
25640 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
25650 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
25660 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
25670 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
25680 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25690 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
256a0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
256b0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
256c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
256d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
256e0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
256f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
25700 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
25720 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
25730 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
25740 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
25750 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
25760 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
25770 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
25780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25790 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
257a0 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  xt<0 ){.    pCur
257b0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
257c0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
257d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
257e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
257f0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a  >skipNext = 0;..
25800 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
25810 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25820 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
25830 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
25840 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
25850 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
25860 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
25870 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
25880 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
25890 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
258a0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
258b0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
258c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
258d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
258e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
258f0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
25900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
25910 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
25920 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
25930 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
25940 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
25950 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
25960 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
25970 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
25980 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
25990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
259a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
259b0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
259c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  r);.    }.    pC
259d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
259e0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
259f0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
25a00 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25a10 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
25a20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
25a30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25a40 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
25a50 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
25a60 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25a80 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
25a90 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
25aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
25ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25ac0 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
25ad0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
25ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
25af0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
25b00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
25b10 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
25b20 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
25b30 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
25b40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
25b50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25b60 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
25b70 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
25b80 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
25b90 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
25ba0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
25bb0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
25bc0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
25bd0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
25be0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
25bf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25c00 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
25c10 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
25c20 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
25c30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
25c40 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
25c50 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
25c60 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
25c70 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
25c80 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
25c90 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
25ca0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
25cb0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
25cc0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
25cd0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
25ce0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
25cf0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
25d00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
25d10 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
25d20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
25d30 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
25d40 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
25d50 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
25d60 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
25d70 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
25d80 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
25d90 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
25da0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
25db0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
25dc0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
25dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25de0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
25df0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
25e00 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
25e10 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
25e20 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
25e30 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
25e40 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
25e50 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
25e60 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
25e70 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
25e80 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
25e90 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
25ea0 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
25eb0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
25ec0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
25ed0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
25ee0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
25ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
25f00 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
25f10 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
25f20 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
25f30 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
25f40 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
25f50 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
25f60 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
25f70 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
25f80 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
25f90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
25fa0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
25fb0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
25fc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25fd0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
25fe0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
25ff0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
26000 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
26010 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
26020 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
26030 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
26040 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
26050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
26060 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
26070 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
26080 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
26090 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
260a0 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
260b0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
260c0 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74  (pBt);.  n = get
260d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
260e0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
260f0 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
26100 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
26110 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
26120 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26130 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
26140 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
26150 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
26160 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
26170 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
26180 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
26190 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
261a0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
261b0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
261c0 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
261d0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
261e0 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
261f0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
26200 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
26210 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
26220 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
26230 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
26240 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
26250 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
26260 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
26270 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
26280 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
26290 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
262a0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
262b0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
262c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
262d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
262e0 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
262f0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
26300 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
26310 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26320 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
26330 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
26340 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
26350 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
26360 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
26370 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
26380 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
26390 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
263a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
263b0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
263c0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
263d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
263e0 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
263f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
26400 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
26410 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
26420 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
26430 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
26440 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
26450 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
26460 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
26470 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
26480 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
26490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
264a0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
264b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
264c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
264d0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
264e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
264f0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
26500 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
26510 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
26520 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
26530 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
26540 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
26550 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
26560 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
26570 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
26580 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
26590 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
265a0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
265b0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
265c0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
265d0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
265e0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
265f0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
26600 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
26610 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
26620 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
26630 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
26640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
26650 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
26660 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
26670 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
26680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
26690 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
266a0 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
266b0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
266c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
266d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
266e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
266f0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
26700 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
26710 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
26720 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26730 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
26740 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
26750 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
26760 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
26770 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
26780 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
26790 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
267a0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
267b0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
267c0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
267d0 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
267e0 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
267f0 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
26800 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
26810 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
26820 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
26830 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
26840 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
26850 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
26860 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
26870 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
26880 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
26890 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
268a0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
268b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
268c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
268d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
268e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
268f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
26900 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
26910 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
26920 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
26930 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
26940 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
26950 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
26960 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
26970 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
26980 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
26990 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
269a0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
269b0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
269c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
269d0 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
269e0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
269f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
26a00 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
26a10 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
26a20 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
26a30 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
26a40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26a50 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
26a60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26a70 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
26a80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26a90 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
26aa0 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26  f( searchList &&
26ab0 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20   nearby==iTrunk 
26ac0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
26ad0 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
26ae0 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
26af0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
26b00 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
26b10 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
26b20 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
26b30 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
26b40 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
26b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26b60 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20   *pPgno==iTrunk 
26b70 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
26b80 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
26b90 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
26ba0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
26bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26bc0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
26bd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
26be0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
26bf0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
26c00 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
26c10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26c20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
26c30 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
26c40 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
26c50 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
26c60 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
26c70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
26c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
26c90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26ca0 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
26cb0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
26cc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
26cd0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
26ce0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26d00 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
26d10 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
26d20 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
26d30 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
26d40 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
26d50 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
26d60 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
26d70 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
26d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
26d90 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
26da0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
26db0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
26dc0 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
26dd0 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
26de0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
26df0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
26e00 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
26e10 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
26e20 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
26e30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
26e40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
26e50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
26e60 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
26e70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26e80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26e90 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
26ea0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
26eb0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
26ec0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
26ed0 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
26ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26f10 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26f20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
26f30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26f40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26f50 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
26f60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26f70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26f90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
26fa0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
26fb0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
26fc0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
26fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26fe0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
26ff0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27000 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
27010 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
27020 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
27030 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
27040 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
27050 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
27060 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
27070 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
27080 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
27090 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
270a0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
270b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
270c0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
270d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
270e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
270f0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
27100 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
27110 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
27120 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27130 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
27140 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27150 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
27160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27170 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
27180 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27190 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
271b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
271c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
271d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
271e0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
271f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
27200 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
27210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27220 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
27230 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
27240 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
27250 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
27260 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
27270 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
27280 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
27290 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
272a0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
272b0 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
272c0 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
272d0 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
272e0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
272f0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
27300 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
27310 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
27320 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27330 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27340 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27360 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27370 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27380 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27390 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
273a0 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
273b0 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
273c0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
273d0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
273e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
273f0 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
27400 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
27410 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
27420 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
27430 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
27440 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
27450 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
27460 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
27470 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
27480 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
27490 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
274a0 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
274b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
274c0 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
274d0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
274e0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
274f0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
27500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27530 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
27540 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
27550 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
27560 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
27570 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
27580 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
27590 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
275a0 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
275b0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
275c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
275d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
275e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
275f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
27600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
27610 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
27620 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
27630 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
27640 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
27650 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
27660 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
27670 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
27680 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
27690 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
276a0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
276b0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
276c0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
276d0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
276e0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
276f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27700 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
27710 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
27720 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
27730 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
27740 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
27750 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
27760 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
27770 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
27780 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
27790 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
277a0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
277b0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
277c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
277d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
277e0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
277f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   );.          no
27800 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
27810 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
27820 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20  t, *pPgno);.    
27830 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
27840 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
27850 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
27860 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
27870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
278a0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
278b0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
278c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
278d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
278e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
278f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
27900 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
27920 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
27930 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
27940 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
27950 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
27960 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
27970 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
27980 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
27990 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
279a0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
279b0 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
279c0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
279d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
279e0 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
279f0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
27a00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
27a10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27a20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
27a30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
27a40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27a50 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
27a60 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
27a70 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
27a80 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
27a90 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
27aa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27ab0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
27ac0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
27ad0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
27ae0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
27af0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
27b00 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
27b10 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
27b20 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
27b30 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
27b40 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
27b50 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
27b60 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
27b70 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
27b80 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
27b90 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
27ba0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
27bb0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
27bc0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
27bd0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
27be0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
27bf0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
27c00 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
27c10 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
27c20 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
27c30 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
27c40 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
27c50 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
27c60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
27c70 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
27c80 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
27c90 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
27ca0 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  e, &pPg, 1);.   
27cb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27ce0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
27cf0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
27d00 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
27d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27d20 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
27d30 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
27d40 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
27d50 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
27d60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
27d70 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
27d80 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
27d90 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
27da0 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
27db0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
27dc0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
27dd0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
27de0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
27df0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
27e00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
27e10 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
27e20 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
27e30 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
27e40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
27e50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
27e60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27e70 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
27e80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
27e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27ea0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
27eb0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
27ec0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
27ed0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
27ee0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
27ef0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
27f00 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
27f10 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
27f20 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
27f30 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27f40 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
27f50 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
27f60 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
27f70 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
27f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
27f90 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
27fa0 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
27fb0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
27fc0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
27fd0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
27fe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27ff0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
28000 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
28010 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
28020 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
28030 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
28040 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28050 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
28060 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
28070 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
28080 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28090 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
280a0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
280b0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
280c0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
280d0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
280e0 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
280f0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
28100 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
28110 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
28120 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
28130 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
28140 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
28150 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
28160 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
28170 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
28180 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
28190 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
281a0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
281b0 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
281c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
281d0 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
281e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
281f0 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
28200 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
28210 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
28220 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
28230 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
28240 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
28250 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
28260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28270 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
28280 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
28290 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
282a0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
282b0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
282d0 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
282e0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
282f0 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
28320 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
28330 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
28340 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
28350 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
28360 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
28370 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
28380 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
28390 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
283a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
283b0 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
283c0 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
283d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
28400 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
28430 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
28440 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
28450 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
28460 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28470 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
28480 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
28490 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
284a0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
284b0 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
284c0 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
284d0 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
284e0 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
284f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
28500 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
28510 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
28520 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
28530 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
28540 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
28550 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
28560 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
28570 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
28580 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28590 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
285a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
285b0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
285c0 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
285d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
285e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
285f0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
28600 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
28610 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
28620 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
28630 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
28640 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
28650 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
28660 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
28670 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
28680 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
28690 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
286a0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
286b0 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
286c0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
286d0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
286e0 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
286f0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
28700 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
28710 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
28720 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
28730 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
28740 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
28750 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
28760 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
28770 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
28780 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
28790 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
287a0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
287b0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
287c0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
287d0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
287e0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
287f0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
28800 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
28810 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
28820 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
28830 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
28840 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
28850 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
28860 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
28870 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
28880 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
28890 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
288a0 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
288b0 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
288c0 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
288d0 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
288e0 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
288f0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
28900 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
28910 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
28920 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
28930 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
28940 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
28950 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
28960 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
28970 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
28980 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
28990 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
289a0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
289b0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
289c0 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
289d0 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
289e0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
289f0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
28a00 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
28a10 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
28a20 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
28a30 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
28a60 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
28a70 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
28a80 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
28a90 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
28aa0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
28ab0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
28ac0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
28ad0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
28ae0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28af0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
28b00 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
28b10 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
28b20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
28b30 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
28b40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
28b50 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
28b60 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
28b70 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
28b80 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
28b90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28ba0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
28bb0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
28bc0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
28bd0 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
28be0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
28bf0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
28c00 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
28c10 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
28c20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
28c30 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
28c40 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
28c50 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
28c60 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
28c70 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
28c80 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
28c90 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
28ca0 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
28cb0 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
28cc0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
28cd0 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
28ce0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
28cf0 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
28d00 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
28d10 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
28d20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
28d30 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
28d40 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
28d50 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
28d60 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
28d70 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
28d80 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
28d90 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
28da0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
28db0 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
28dc0 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
28dd0 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
28de0 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
28df0 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
28e00 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
28e10 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
28e20 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
28e30 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
28e40 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
28e50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
28e60 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
28e70 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
28e80 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
28e90 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
28ea0 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
28eb0 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
28ec0 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
28ed0 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
28ee0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
28ef0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
28f00 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
28f10 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
28f20 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
28f30 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
28f40 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
28f50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
28f60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28f70 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
28f80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
28f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28fa0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
28fb0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
28fc0 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
28fd0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28fe0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
28ff0 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
29000 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
29010 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e 73  pPage && !pBt->s
29020 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20  ecureDelete ){. 
29030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29040 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
29050 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
29060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29070 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
29080 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
29090 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
290a0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
290b0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
290c0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
290d0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
290e0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
290f0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
29100 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
29110 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
29120 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
29130 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
29140 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
29150 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
29160 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
29170 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
29180 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
29190 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
291a0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
291b0 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
291c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
291d0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
291e0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
291f0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
29200 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
29210 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
29220 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
29230 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
29240 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
29250 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
29260 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
29270 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
29280 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
29290 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
292a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
292b0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
292c0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
292d0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
292e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
292f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
29300 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
29310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29320 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
29330 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
29340 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
29350 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
29360 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
29370 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
29380 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
29390 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
293a0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
293b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
293c0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
293d0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
293e0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
293f0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
29400 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
29410 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
29420 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
29430 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
29440 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
29450 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
29460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
29470 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
29480 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
29490 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
294a0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
294b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
294c0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
294d0 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
294e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
294f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
29500 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
29510 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
29520 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
29530 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
29540 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
29550 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
29560 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
29570 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
29580 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
29590 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
295a0 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
295b0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
295c0 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36  int nOvfl;.  u16
295d0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
295e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
295f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29600 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29610 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
29620 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
29630 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
29640 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
29650 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
29660 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
29670 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
29680 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
29690 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
296a0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
296b0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
296c0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
296d0 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
296e0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
296f0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
29700 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
29710 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
29720 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
29730 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
29740 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
29750 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
29760 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
29770 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
29780 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
29790 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
297a0 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
297b0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
297c0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
297d0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
297e0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
297f0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
29800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
29810 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
29820 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
29830 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
29840 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
29850 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
29860 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
29870 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
29880 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
29890 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
298a0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
298b0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
298c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
298d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
298e0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
298f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
29900 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
29910 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
29920 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
29930 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29940 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
29950 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
29960 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
29970 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
29980 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
29990 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
299a0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
299b0 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
299c0 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
299d0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
299e0 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
299f0 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
29a00 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
29a10 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
29a20 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
29a30 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
29a40 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
29a50 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
29a60 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
29a70 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
29a80 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
29a90 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
29aa0 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
29ab0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
29ac0 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
29ad0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
29ae0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
29af0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
29b00 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
29b10 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
29b20 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
29b30 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
29b40 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
29b50 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
29b60 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
29b70 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
29b80 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
29b90 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
29ba0 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
29bb0 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
29bc0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
29bd0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
29be0 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
29bf0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
29c00 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
29c10 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
29c20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
29c30 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
29c40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
29c50 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
29c60 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
29c70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
29c80 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
29c90 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
29ca0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
29cb0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
29cc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
29cd0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
29ce0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
29cf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29d00 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
29d10 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
29d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29d30 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
29d40 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
29d50 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
29d60 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
29d70 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
29d80 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
29d90 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
29da0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
29db0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
29dc0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
29dd0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
29de0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
29df0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
29e00 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
29e10 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
29e20 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
29e30 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
29e40 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
29e50 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
29e60 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
29e70 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
29e80 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
29e90 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
29ea0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
29eb0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
29ec0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
29ed0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
29ee0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
29ef0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
29f00 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
29f10 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
29f20 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
29f30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
29f40 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
29f50 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
29f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29f70 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
29f80 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
29f90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
29fa0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
29fb0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
29fc0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
29fd0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
29fe0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
29ff0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
2a000 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
2a010 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
2a020 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
2a030 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
2a060 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
2a070 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
2a080 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
2a090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2a0a0 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
2a0b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
2a0c0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
2a0d0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
2a0e0 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
2a0f0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
2a100 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
2a110 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2a120 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
2a130 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2a140 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
2a150 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
2a160 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
2a170 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2a180 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
2a190 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
2a1a0 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
2a1b0 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
2a1c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a1d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2a1e0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2a1f0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
2a200 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
2a210 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
2a220 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
2a230 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
2a240 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
2a250 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
2a260 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
2a270 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2a280 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
2a290 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
2a2a0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2a2b0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2a2c0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2a2d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a2e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2a2f0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2a300 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
2a310 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
2a320 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2a330 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2a340 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
2a350 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
2a360 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
2a370 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2a380 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
2a390 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
2a3a0 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
2a3b0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
2a3c0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2a3d0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
2a3e0 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
2a3f0 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ey);.  btreePars
2a400 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2a410 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2a420 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
2a430 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
2a440 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2a450 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
2a460 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
2a470 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
2a480 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
2a490 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
2a4a0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
2a4b0 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
2a4c0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
2a4d0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2a4e0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2a4f0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
2a500 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
2a510 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
2a520 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37  ( NEVER(nKey>0x7
2a530 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d  fffffff || pKey=
2a540 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  =0) ){.      ret
2a550 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2a560 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2a570 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
2a580 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
2a590 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
2a5a0 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
2a5b0 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
2a5c0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
2a5d0 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
2a5e0 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
2a5f0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
2a600 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
2a610 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
2a620 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
2a630 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
2a640 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
2a650 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
2a660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a670 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
2a680 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
2a690 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
2a6a0 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2a6b0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
2a6c0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
2a6d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2a6e0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
2a6f0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
2a700 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
2a710 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
2a720 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
2a730 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
2a740 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
2a750 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2a760 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
2a770 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2a780 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2a790 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2a7a0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
2a7b0 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
2a7c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a7d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2a7e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
2a7f0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2a800 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
2a810 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
2a820 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
2a830 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
2a840 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
2a850 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
2a860 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
2a870 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
2a880 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
2a890 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2a8a0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
2a8b0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
2a8c0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
2a8d0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
2a8e0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
2a8f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
2a900 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
2a910 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
2a920 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
2a930 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2a940 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
2a950 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
2a960 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
2a970 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
2a980 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
2a990 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
2a9a0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
2a9b0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
2a9c0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
2a9d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
2a9e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2a9f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2aa00 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
2aa10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
2aa20 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
2aa30 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
2aa40 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
2aa50 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
2aa60 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2aa70 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
2aa80 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
2aa90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2aaa0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
2aab0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
2aac0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2aad0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2aae0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2aaf0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ab00 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2ab10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ab20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2ab30 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
2ab40 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
2ab50 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
2ab60 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
2ab70 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
2ab80 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
2ab90 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
2aba0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2abb0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
2abc0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2abd0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2abe0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2abf0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2ac00 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
2ac10 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
2ac20 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2ac30 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2ac40 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2ac50 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
2ac60 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
2ac70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ac80 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
2ac90 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
2aca0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2acb0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2acc0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2acd0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ace0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2acf0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
2ad00 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
2ad10 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
2ad20 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2ad30 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
2ad40 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
2ad50 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
2ad60 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
2ad70 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
2ad80 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
2ad90 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
2ada0 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
2adb0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
2adc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2add0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
2ade0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
2adf0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
2ae00 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
2ae10 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
2ae20 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2ae30 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
2ae40 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
2ae50 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
2ae60 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2ae70 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2ae80 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2ae90 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2aea0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2aeb0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2aec0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2aed0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2aee0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
2aef0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
2af00 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2af10 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2af20 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2af30 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
2af40 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2af50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2af60 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
2af70 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
2af80 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2af90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2afa0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2afb0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2afc0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2afd0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
2afe0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
2aff0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
2b000 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
2b010 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
2b020 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
2b030 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
2b040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b050 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
2b060 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
2b070 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
2b080 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
2b090 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
2b0a0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
2b0b0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
2b0c0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
2b0d0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
2b0e0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2b0f0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
2b100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2b110 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2b120 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
2b130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b140 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
2b150 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
2b160 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
2b170 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
2b180 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
2b190 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
2b1a0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
2b1b0 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
2b1c0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
2b1d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2b1e0 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
2b1f0 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
2b200 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
2b210 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
2b220 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2b230 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
2b240 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
2b250 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
2b260 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
2b270 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
2b280 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
2b290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2b2a0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
2b2b0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e   int *pRC){.  in
2b2c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
2b2d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2b2e0 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
2b2f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2b300 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
2b310 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
2b320 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
2b330 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
2b340 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
2b350 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
2b360 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
2b370 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
2b380 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2b390 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
2b3a0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
2b3b0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
2b3c0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
2b3d0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
2b3e0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
2b3f0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
2b400 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2b410 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2b420 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
2b430 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2b440 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2b450 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
2b460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2b470 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b480 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2b490 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2b4a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b4b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2b4c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
2b4d0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2b4e0 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
2b4f0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2b500 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
2b510 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
2b520 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
2b530 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
2b540 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
2b550 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2b560 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
2b570 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
2b580 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2b590 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 67   );.  if( pc < g
2b5a0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2b5b0 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
2b5c0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2b5d0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
2b5e0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2b5f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
2b600 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
2b610 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
2b620 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
2b630 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
2b640 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2b650 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69  n;.  }.  for(i=i
2b660 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
2b670 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
2b680 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
2b690 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
2b6a0 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
2b6b0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2b6c0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2b6d0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2b6e0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2b6f0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2b700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2b710 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2b720 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2b730 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2b740 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2b750 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2b760 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2b770 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2b780 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2b790 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2b7a0 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2b7b0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2b7c0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2b7d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2b7e0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2b7f0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2b800 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2b810 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2b820 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2b830 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2b840 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
2b850 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2b860 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2b870 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2b880 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2b890 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2b8a0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2b8b0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2b8c0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2b8d0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2b8e0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2b8f0 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2b900 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2b910 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2b920 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2b930 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2b940 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2b950 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2b960 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2b970 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2b980 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2b990 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2b9a0 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2b9b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2b9c0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2b9d0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2b9e0 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2b9f0 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2ba00 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2ba10 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2ba20 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2ba30 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2ba40 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2ba50 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2ba60 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2ba70 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2ba80 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2ba90 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2baa0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2bab0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2bac0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2bad0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2bae0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2bb00 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2bb10 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2bb20 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2bb30 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2bb40 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2bb50 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2bb60 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2bb70 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2bb80 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2bb90 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2bba0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2bbb0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2bbc0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2bbd0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2bbe0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2bbf0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
2bc00 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2bc10 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2bc20 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2bc30 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2bc40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2bc50 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2bc60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2bc70 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2bc80 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2bc90 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2bca0 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2bcb0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2bcc0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2bcd0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2bce0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2bcf0 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2bd00 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2bd10 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2bd20 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2bd30 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2bd40 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2bd50 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2bd60 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2bd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2bd80 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2bd90 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2bda0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
2bdb0 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
2bdc0 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
2bdd0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2bde0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2bdf0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
2be00 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
2be10 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
2be20 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2be30 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2be40 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2be50 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
2be60 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
2be70 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2be80 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
2be90 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
2bea0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2beb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2bec0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2bed0 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
2bee0 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
2bef0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
2bf00 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
2bf10 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
2bf20 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
2bf30 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
2bf40 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
2bf50 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
2bf60 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
2bf70 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
2bf80 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
2bf90 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
2bfa0 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
2bfb0 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
2bfc0 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
2bfd0 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
2bfe0 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
2bff0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
2c000 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
2c010 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
2c020 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2c030 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
2c040 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2c050 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2c060 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
2c070 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
2c080 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c090 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
2c0a0 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
2c0b0 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
2c0c0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
2c0d0 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
2c0e0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2c0f0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
2c100 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
2c110 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2c120 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
2c130 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2c140 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
2c150 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
2c160 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
2c170 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2c180 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
2c190 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  e->aOvfl[0])) );
2c1a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
2c1b0 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
2c1c0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
2c1d0 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75  Ovfl[j].idx = (u
2c1e0 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2c1f0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2c200 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2c210 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2c220 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2c240 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2c250 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2c260 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c270 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c280 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2c290 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2c2a0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2c2b0 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2c2c0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2c2d0 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2c2e0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2c2f0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2c300 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2c310 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2c320 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2c330 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2c340 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2c350 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2c360 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2c370 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
2c380 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
2c390 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2c3a0 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
2c3b0 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
2c3c0 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
2c3d0 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
2c3e0 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
2c3f0 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61  t( idx+sz <= pPa
2c400 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2c410 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
2c420 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
2c430 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2c440 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
2c450 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
2c460 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
2c470 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
2c480 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
2c490 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2c4a0 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
2c4b0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
2c4c0 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74     for(j=end, pt
2c4d0 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
2c4e0 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
2c4f0 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
2c500 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
2c510 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
2c520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
2c530 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
2c540 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
2c550 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
2c560 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
2c570 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
2c580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c590 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2c5a0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
2c5b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2c5c0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
2c5d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
2c5e0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
2c5f0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
2c600 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
2c610 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
2c620 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2c630 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
2c640 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
2c650 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2c660 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
2c670 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
2c680 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
2c690 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
2c6a0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
2c6b0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
2c6c0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
2c6d0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
2c6e0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
2c6f0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
2c700 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2c710 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
2c720 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
2c730 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
2c740 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
2c750 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
2c760 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
2c770 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2c780 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
2c790 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2c7a0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
2c7b0 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2c7c0 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
2c7d0 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
2c7e0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
2c7f0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
2c800 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2c810 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2c820 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
2c830 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
2c840 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2c850 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
2c860 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
2c870 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2c880 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
2c890 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
2c8a0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2c8b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2c8c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
2c8d0 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
2c8e0 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
2c8f0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2c900 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2c910 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
2c920 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
2c930 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
2c940 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
2c950 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
2c960 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
2c970 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2c980 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c990 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2c9a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2c9b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2c9c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2c9d0 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
2c9e0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2c9f0 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2ca00 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2ca10 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73  )<=10921);.  ass
2ca20 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ca30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ca40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ca50 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2ca60 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
2ca70 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
2ca80 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
2ca90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2caa0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2cab0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e  ssert( get2byteN
2cac0 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
2cad0 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b  +5])==nUsable );
2cae0 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26  ..  pCellptr = &
2caf0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2cb00 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
2cb10 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
2cb20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
2cb30 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
2cb40 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70  i--){.    pCellp
2cb50 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
2cb60 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69  lbody -= aSize[i
2cb70 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  ];.    put2byte(
2cb80 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
2cb90 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
2cba0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
2cbb0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
2cbc0 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74  e[i]);.  }.  put
2cbd0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2cbe0 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
2cbf0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2cc00 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
2cc10 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
2cc20 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
2cc30 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
2cc40 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
2cc50 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
2cc60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2cc70 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
2cc80 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
2cc90 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
2cca0 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
2ccb0 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
2ccc0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
2ccd0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2cce0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
2ccf0 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
2cd00 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
2cd10 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2cd20 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
2cd30 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
2cd40 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
2cd50 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
2cd60 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
2cd70 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
2cd80 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
2cd90 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2cda0 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
2cdb0 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
2cdc0 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
2cdd0 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
2cde0 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
2cdf0 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
2ce00 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
2ce10 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
2ce20 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
2ce30 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
2ce40 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
2ce50 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
2ce60 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
2ce70 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
2ce80 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
2ce90 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
2cea0 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
2ceb0 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
2cec0 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
2ced0 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
2cee0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
2cef0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2cf00 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
2cf10 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
2cf20 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
2cf30 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
2cf40 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
2cf50 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
2cf60 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2cf70 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
2cf80 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
2cf90 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
2cfa0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
2cfb0 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
2cfc0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
2cfd0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
2cfe0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
2cff0 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
2d000 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
2d010 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
2d020 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
2d030 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
2d040 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
2d050 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
2d060 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
2d070 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
2d080 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2d090 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2d0a0 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2d0b0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2d0c0 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2d0d0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2d0e0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2d0f0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2d100 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2d110 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2d120 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2d130 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2d140 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2d150 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2d160 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2d170 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2d180 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2d190 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2d1a0 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2d1b0 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2d1c0 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2d1d0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2d1e0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2d1f0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2d200 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2d210 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2d220 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2d230 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2d240 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2d250 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2d260 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2d270 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2d280 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2d290 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2d2a0 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2d2b0 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2d2c0 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2d2d0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2d2e0 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2d2f0 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2d300 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2d310 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2d320 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2d330 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2d340 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2d350 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2d360 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2d370 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2d380 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2d390 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2d3a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2d3b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2d3c0 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2d3d0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2d3e0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2d3f0 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2d400 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2d410 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2d420 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2d430 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2d440 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d460 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2d470 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2d480 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2d4b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2d4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2d4e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2d4f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2d500 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d510 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2d520 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2d530 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d540 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2d550 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2d560 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d570 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2d580 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
2d590 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77  condition is now
2d5a0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
2d5b0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66   reaching this f
2d5c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
2d5d0 20 4e 45 56 45 52 28 70 50 61 67 65 2d 3e 6e 43   NEVER(pPage->nC
2d5e0 65 6c 6c 3c 3d 30 29 20 29 20 72 65 74 75 72 6e  ell<=0) ) return
2d5f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d600 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
2d610 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
2d620 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
2d630 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
2d640 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
2d650 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
2d660 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
2d670 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
2d680 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
2d690 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
2d6a0 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
2d6b0 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
2d6c0 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
2d6d0 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
2d6e0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
2d6f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2d700 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
2d710 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
2d720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d730 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
2d740 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
2d750 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
2d760 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
2d770 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  l;.    u16 szCel
2d780 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
2d790 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2d7a0 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
2d7b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2d7c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d7d0 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
2d7e0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2d7f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2d800 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
2d810 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2d820 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
2d830 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
2d840 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2d850 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
2d860 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2d870 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
2d880 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f  &szCell);..    /
2d890 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2d8a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2d8b0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2d8c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
2d8d0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
2d8e0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
2d8f0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
2d900 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
2d910 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
2d920 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
2d930 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74  low page. If eit
2d940 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20  her of these.   
2d950 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66   ** operations f
2d960 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e  ails, the return
2d970 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75   code is set, bu
2d980 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  t the contents. 
2d990 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72     ** of the par
2d9a0 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69  ent page are sti
2d9b0 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62  ll manipulated b
2d9c0 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77  y thh code below
2d9d0 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73  ..    ** That is
2d9e0 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69   Ok, at this poi
2d9f0 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nt the parent pa
2da00 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ge is guaranteed
2da10 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61   to.    ** be ma
2da20 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52  rked as dirty. R
2da30 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
2da40 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  r code will caus
2da50 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  e a.    ** rollb
2da60 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  ack, undoing any
2da70 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
2da80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2da90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2daa0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2dab0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2dac0 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
2dad0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2dae0 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
2daf0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65  ;.      if( szCe
2db00 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  ll>pNew->minLoca
2db10 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  l ){.        ptr
2db20 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
2db30 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ew, pCell, &rc);
2db40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2db50 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2db60 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
2db70 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
2db80 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
2db90 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
2dba0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
2dbb0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2dbc0 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
2dbd0 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
2dbe0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
2dbf0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
2dc00 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
2dc10 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2dc20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
2dc30 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
2dc40 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
2dc50 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
2dc60 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
2dc70 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
2dc80 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
2dc90 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
2dca0 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
2dcb0 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
2dcc0 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
2dcd0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
2dce0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
2dcf0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2dd00 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
2dd10 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
2dd20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
2dd30 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
2dd40 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2dd50 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
2dd60 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
2dd70 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
2dd80 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
2dd90 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
2dda0 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
2ddb0 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
2ddc0 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
2ddd0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
2dde0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
2ddf0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
2de00 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2de10 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
2de20 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
2de30 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2de40 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
2de50 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
2de60 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2de70 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2de80 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
2de90 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2dea0 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
2deb0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2dec0 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
2ded0 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
2dee0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2def0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
2df00 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
2df10 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2df20 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
2df30 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2df40 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ent, pParent->nC
2df50 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e  ell, pSpace, (in
2df60 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
2df70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2df80 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  0, pPage->pgno, 
2df90 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  &rc);..    /* Se
2dfa0 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
2dfb0 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
2dfc0 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
2dfd0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
2dfe0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
2dff0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2e000 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2e010 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
2e020 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
2e030 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
2e040 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2e050 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
2e060 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
2e070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2e080 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2e090 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2e0a0 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
2e0b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e0c0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2e0d0 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
2e0e0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
2e0f0 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
2e100 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
2e110 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
2e120 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
2e130 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
2e140 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
2e150 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
2e160 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
2e170 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
2e180 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
2e190 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
2e1a0 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
2e1b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
2e1c0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
2e1d0 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
2e1e0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2e1f0 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
2e200 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
2e210 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2e220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e230 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
2e240 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
2e250 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
2e260 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
2e270 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
2e280 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
2e290 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
2e2a0 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74  ge, j);.      bt
2e2b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2e2c0 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
2e2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
2e2e0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
2e2f0 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
2e300 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
2e310 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2e320 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2e330 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
2e340 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2e350 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2e360 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2e370 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
2e380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e390 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e3a0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
2e3b0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
2e3c0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2e3d0 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2e3e0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2e3f0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2e400 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2e410 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2e420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e430 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e440 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
2e450 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2e460 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2e470 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2e480 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
2e490 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2e4a0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2e4b0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2e4c0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2e4d0 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2e4e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e4f0 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
2e500 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e510 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
2e520 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2e530 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
2e540 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
2e550 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2e560 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
2e570 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
2e580 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
2e590 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
2e5a0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
2e5b0 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
2e5c0 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
2e5d0 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
2e5e0 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
2e5f0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
2e600 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
2e610 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
2e620 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
2e630 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
2e640 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
2e650 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2e660 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
2e670 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
2e680 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2e690 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2e6a0 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
2e6b0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
2e6c0 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
2e6d0 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
2e6e0 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
2e6f0 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
2e700 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20  aOvfl[] array), 
2e710 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70  they are not cop
2e720 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a  ied to pTo. .**.
2e730 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
2e740 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73  ing, page pTo is
2e750 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75   reinitialized u
2e760 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61  sing btreeInitPa
2e770 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
2e780 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
2e790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2e7a0 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
2e7b0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
2e7c0 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
2e7d0 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
2e7e0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2e7f0 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
2e800 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
2e810 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
2e820 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
2e830 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
2e840 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
2e850 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65  pyNodeContent(Me
2e860 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65  mPage *pFrom, Me
2e870 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20  mPage *pTo, int 
2e880 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2e890 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2e8a0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
2e8b0 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72   const pBt = pFr
2e8c0 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20  om->pBt;.    u8 
2e8d0 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20  * const aFrom = 
2e8e0 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20  pFrom->aData;.  
2e8f0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
2e900 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
2e910 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72     int const iFr
2e920 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
2e930 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e  drOffset;.    in
2e940 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
2e950 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
2e960 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20   ? 100 : 0);.   
2e970 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
2e980 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20   iData;.  .  .  
2e990 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2e9a0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61  >isInit );.    a
2e9b0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
2e9c0 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
2e9d0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
2e9e0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2e9f0 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73  Hdr+5])<=pBt->us
2ea00 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
2ea10 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
2ea20 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
2ea30 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
2ea40 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2ea50 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
2ea60 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2ea70 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
2ea80 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
2ea90 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
2eaa0 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
2eab0 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
2eac0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
2ead0 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
2eae0 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
2eaf0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
2eb00 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
2eb10 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
2eb20 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
2eb30 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
2eb40 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
2eb50 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
2eb60 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
2eb70 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
2eb80 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
2eb90 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
2eba0 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
2ebb0 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
2ebc0 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
2ebd0 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
2ebe0 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
2ebf0 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
2ec00 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
2ec10 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
2ec20 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
2ec30 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
2ec40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ec50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ec60 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2ec70 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2ec80 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2ec90 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2eca0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2ecb0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2ecc0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
2ecd0 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
2ece0 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
2ecf0 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
2ed00 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
2ed10 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
2ed20 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2ed30 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2ed40 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
2ed50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
2ed60 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2ed70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2ed80 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2ed90 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2eda0 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2edb0 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2edc0 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2edd0 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2ede0 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2edf0 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2ee00 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2ee10 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2ee20 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2ee30 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2ee40 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2ee50 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2ee60 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2ee70 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2ee80 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2ee90 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2eea0 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2eeb0 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2eec0 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2eed0 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2eee0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2eef0 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2ef00 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2ef10 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2ef20 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2ef30 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2ef40 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2ef50 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2ef60 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2ef70 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2ef80 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2ef90 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2efa0 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2efb0 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2efc0 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2efd0 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2efe0 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2eff0 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2f000 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2f010 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2f020 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2f030 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2f040 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2f050 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f060 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2f070 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2f080 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2f090 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2f0a0 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2f0b0 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2f0c0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2f0d0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2f0e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2f0f0 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2f100 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2f110 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2f120 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2f130 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2f140 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2f150 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2f160 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2f170 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2f180 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2f190 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2f1a0 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2f1b0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2f1c0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2f1d0 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2f1e0 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2f1f0 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2f200 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2f210 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2f220 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2f230 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2f240 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2f250 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2f260 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2f270 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2f280 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2f290 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2f2a0 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2f2b0 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2f2c0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2f2d0 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2f2e0 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2f2f0 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2f300 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2f310 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2f320 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2f330 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2f340 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2f350 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2f360 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2f370 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2f380 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2f390 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2f3a0 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2f3b0 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
2f3c0 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
2f3d0 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
2f3e0 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
2f3f0 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
2f400 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
2f410 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
2f420 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
2f430 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
2f440 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2f450 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
2f460 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
2f470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f480 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
2f490 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
2f4a0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
2f4b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
2f4c0 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
2f4d0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
2f4e0 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
2f4f0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
2f500 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
2f510 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
2f520 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
2f530 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
2f540 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
2f550 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
2f560 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
2f570 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
2f580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
2f590 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
2f5a0 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
2f5b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2f5c0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2f5d0 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
2f5e0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
2f5f0 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65  nroot(.  MemPage
2f600 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
2f610 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
2f620 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69  nt page of sibli
2f630 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ngs being balanc
2f640 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
2f650 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20  entIdx,         
2f660 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f670 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69   of "the page" i
2f680 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75  n pParent */.  u
2f690 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20  8 *aOvflSpace,  
2f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f6b0 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  * page-size byte
2f6c0 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70  s of space for p
2f6d0 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20  arent ovfl */.  
2f6e0 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20  int isRoot      
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f700 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
2f710 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  nt is a root-pag
2f720 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
2f730 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2f740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2f750 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
2f760 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f780 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2f790 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2f7a0 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
2f7b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f7c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
2f7d0 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
2f7e0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
2f7f0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
2f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f810 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f820 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
2f830 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
2f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f850 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f860 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
2f870 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
2f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f890 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2f8a0 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
2f8d0 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
2f8e0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
2f8f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f900 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  K;          /* T
2f910 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2f920 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72  /.  u16 leafCorr
2f930 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
2f940 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
2f950 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2f960 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
2f970 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
2f980 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f990 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2f9a0 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
2f9b0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2f9c0 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
2f9d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
2f9e0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
2f9f0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
2fa00 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2fa20 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
2fa30 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
2fa40 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
2fa50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2fa60 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
2fa70 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
2fa80 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
2fa90 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
2faa0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2fab0 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
2fac0 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
2fad0 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b   iOvflSpace = 0;
2fae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2faf0 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2fb00 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a  f aOvflSpace[] *
2fb10 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
2fb20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2fb30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
2fb40 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
2fb50 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
2fb60 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
2fb70 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2fb80 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
2fb90 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50  blings */.  MemP
2fba0 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
2fbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
2fbc0 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
2fbd0 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
2fbe0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
2fbf0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
2fc00 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2fc10 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
2fc20 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
2fc30 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20    u8 *pRight;   
2fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fc50 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61  * Location in pa
2fc60 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69  rent of right-si
2fc70 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f  bling pointer */
2fc80 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d  .  u8 *apDiv[NB-
2fc90 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
2fca0 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
2fcb0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2fcc0 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
2fcd0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2fce0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
2fcf0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
2fd00 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
2fd10 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2fd30 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
2fd40 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
2fd50 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
2fd60 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
2fd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2fd80 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
2fd90 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2fda0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2fdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2fdc0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2fdd0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2fde0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
2fdf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe00 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
2fe10 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
2fe20 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
2fe30 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
2fe40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2fe50 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
2fe60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2fe70 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72  */..  pBt = pPar
2fe80 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
2fe90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2fea0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2feb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2fec0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2fed0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2fee0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
2fef0 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
2ff00 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
2ff10 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
2ff20 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2ff30 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2ff40 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2ff50 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
2ff60 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
2ff70 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
2ff80 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
2ff90 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
2ffa0 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
2ffb0 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
2ffc0 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
2ffd0 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
2ffe0 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
2fff0 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
30000 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
30010 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
30020 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
30030 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
30040 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
30050 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
30060 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
30070 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
30080 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
30090 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
300a0 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
300b0 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
300c0 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20  idx==iParentIdx 
300d0 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c  );..  if( !aOvfl
300e0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74  Space ){.    ret
300f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
30100 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
30110 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
30120 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41  es to balance. A
30130 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63  lso locate the c
30140 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
30150 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64  .  ** that divid
30160 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  e the siblings. 
30170 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
30180 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69  de to find NN si
30190 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20  blings on .  ** 
301a0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
301b0 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69  Page. More sibli
301c0 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
301d0 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77  om one side, how
301e0 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74  ever, .  ** if t
301f0 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
30200 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
30210 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
30220 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  e. If pParent.  
30230 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
30240 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
30250 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
30260 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
30270 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  en.  .  **.  ** 
30280 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64  This loop also d
30290 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72  rops the divider
302a0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20   cells from the 
302b0 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69  parent page. Thi
302c0 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20  s.  ** way, the 
302d0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
302e0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
302f0 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20  ot have to deal 
30300 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76  with any.  ** ov
30310 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20  erflow cells in 
30320 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
30330 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78   since if any ex
30340 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a  isted they will.
30350 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64    ** have alread
30360 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a  y been removed..
30370 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65    */.  i = pPare
30380 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20  nt->nOverflow + 
30390 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a  pParent->nCell;.
303a0 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20    if( i<2 ){.   
303b0 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
303c0 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65  nOld = i+1;.  }e
303d0 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  lse{.    nOld = 
303e0 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  3;.    if( iPare
303f0 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20  ntIdx==0 ){     
30400 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
30410 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
30420 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72    }else if( iPar
30430 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20  entIdx==i ){.   
30440 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a     nxDiv = i-2;.
30450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30460 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74   nxDiv = iParent
30470 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  Idx-1;.    }.   
30480 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66   i = 2;.  }.  if
30490 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
304a0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
304b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
304c0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
304d0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
304e0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
304f0 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
30500 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
30510 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
30520 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
30530 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
30540 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
30550 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
30560 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
30570 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
30580 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
30590 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
305a0 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
305b0 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
305c0 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
305d0 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  *));.      goto 
305e0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
305f0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43  .    }.    nMaxC
30600 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
30610 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
30620 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
30630 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20     if( (i--)==0 
30640 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66  ) break;..    if
30650 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  ( i+nxDiv==pPare
30660 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
30670 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
30680 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
30690 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
306a0 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  nt->aOvfl[0].pCe
306b0 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  ll;.      pgno =
306c0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
306d0 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
306e0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
306f0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
30700 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72  [i]);.      pPar
30710 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ent->nOverflow =
30720 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
30730 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
30740 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
30750 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
30760 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
30770 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
30780 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
30790 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
307a0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
307b0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
307c0 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20  ..      /* Drop 
307d0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  the cell from th
307e0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61  e parent page. a
307f0 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f  pDiv[i] still po
30800 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ints to.      **
30810 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
30820 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65   the parent, eve
30830 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20  n though it has 
30840 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20  been dropped..  
30850 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73      ** This is s
30860 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70  afe because drop
30870 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79  ping a cell only
30880 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
30890 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
308a0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c  our bytes of it,
308b0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
308c0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
308d0 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
308e0 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
308f0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
30900 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74  ll. So the point
30910 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  er is safe to us
30920 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72  e.      ** later
30930 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a   on.  .      **.
30940 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
30950 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
30960 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c  ed in secure-del
30970 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ete mode. In thi
30980 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a  s case,.      **
30990 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20   the dropCell() 
309a0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65  routine will ove
309b0 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72  rwrite the entir
309c0 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f  e cell with zero
309d0 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  es..      ** In 
309e0 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f  this case, tempo
309f0 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20  rarily copy the 
30a00 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f  cell into the aO
30a10 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20  vflSpace[].     
30a20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77   ** buffer. It w
30a30 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75  ill be copied ou
30a40 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20  t again as soon 
30a50 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20  as the aSpace[] 
30a60 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20  buffer.      ** 
30a70 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  is allocated.  *
30a80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
30a90 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
30aa0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
30ab0 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  f = SQLITE_PTR_T
30ac0 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20  O_INT(apDiv[i]) 
30ad0 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  - SQLITE_PTR_TO_
30ae0 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  INT(pParent->aDa
30af0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
30b00 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29   (iOff+szNew[i])
30b10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
30b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
30b30 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30b40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
30b50 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
30b60 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
30b70 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
30b80 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
30b90 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
30ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30bb0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
30bc0 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
30bd0 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
30be0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
30bf0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
30c00 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
30c10 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
30c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30c30 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
30c40 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
30c50 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
30c60 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
30c70 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
30c80 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
30c90 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
30ca0 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
30cb0 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
30cc0 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
30cd0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
30ce0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
30cf0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
30d00 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
30d10 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
30d20 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
30d30 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
30d40 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
30d50 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
30d60 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
30d70 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
30d80 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
30d90 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
30da0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
30db0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
30dc0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
30dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
30de0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
30df0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
30e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e10 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
30e20 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
30e30 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30e60 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
30e70 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
30e80 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
30e90 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
30ea0 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
30eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
30ec0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
30ed0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
30ee0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
30ef0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
30f00 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
30f10 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
30f20 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
30f30 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
30f40 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
30f50 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
30f60 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
30f70 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
30f80 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
30f90 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
30fa0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
30fb0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
30fc0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
30fd0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
30fe0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
30ff0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
31000 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
31010 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
31020 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
31030 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
31040 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
31050 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
31060 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
31070 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
31080 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
31090 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
310a0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
310b0 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
310c0 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
310d0 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
310e0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
310f0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
31100 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
31110 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
31120 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
31130 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
31140 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
31150 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
31160 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
31170 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
31180 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
31190 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
311a0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
311b0 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
311c0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
311d0 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
311e0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
311f0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
31200 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
31210 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
31220 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
31230 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
31240 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
31250 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
31260 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
31270 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
31280 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
31290 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
312a0 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
312b0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
312c0 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
312d0 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
312e0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
312f0 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
31300 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
31310 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
31320 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
31330 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
31340 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
31350 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
31360 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
31370 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
31380 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
31390 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
313a0 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
313b0 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
313c0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
313d0 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
313e0 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
313f0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
31400 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
31410 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
31420 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
31430 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
31440 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
31450 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
31460 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
31470 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
31480 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
31490 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
314a0 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
314b0 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
314c0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
314d0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
314e0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
314f0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
31500 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
31510 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
31520 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
31530 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
31540 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
31550 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
31560 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
31570 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65  ell]);.      nCe
31580 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
31590 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20  if( i<nOld-1 && 
315a0 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20  !leafData){.    
315b0 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29    u16 sz = (u16)
315c0 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  szNew[i];.      
315d0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
315e0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
315f0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31600 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
31610 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d  = sz;.      pTem
31620 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
31630 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70  ace1];.      iSp
31640 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
31650 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
31660 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
31670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
31680 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
31690 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
316a0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
316b0 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
316c0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
316d0 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
316e0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
316f0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
31700 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
31710 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
31720 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
31730 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
31740 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
31750 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
31760 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
31770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
31780 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
31790 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
317a0 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
317b0 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
317c0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
317d0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
317e0 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
317f0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
31800 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
31810 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
31820 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
31830 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
31840 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
31850 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
31860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31870 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
31880 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
31890 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
318a0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
318b0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
318c0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
318d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
318e0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
318f0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
31900 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
31910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
31920 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
31930 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
31940 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
31950 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
31960 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
31970 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
31980 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
31990 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
319a0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
319b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
319c0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
319d0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
319e0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
319f0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
31a00 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
31a10 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
31a20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
31a30 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
31a40 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
31a50 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
31a60 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
31a70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
31a80 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
31a90 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
31aa0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
31ab0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
31ac0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
31ad0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
31ae0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
31af0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
31b00 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
31b10 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
31b20 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
31b30 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
31b40 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
31b50 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
31b60 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
31b70 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
31b80 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
31b90 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
31ba0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
31bb0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
31bc0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
31bd0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
31be0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
31bf0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
31c00 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
31c10 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
31c20 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
31c30 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
31c40 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
31c50 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
31c60 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
31c70 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
31c80 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
31c90 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
31ca0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
31cb0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
31cc0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
31cd0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
31ce0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
31cf0 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
31d00 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
31d10 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
31d20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
31d30 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
31d40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
31d50 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
31d60 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
31d70 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
31d80 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
31d90 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
31da0 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
31db0 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
31dc0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
31dd0 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
31de0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
31df0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
31e00 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
31e10 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
31e20 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
31e30 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
31e40 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
31e50 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
31e60 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
31e70 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
31e80 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
31e90 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
31ea0 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
31eb0 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
31ec0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
31ed0 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
31ee0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
31ef0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
31f00 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
31f10 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
31f20 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
31f30 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
31f40 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
31f50 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
31f60 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
31f70 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
31f80 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
31f90 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
31fa0 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
31fb0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
31fc0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
31fd0 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
31fe0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
31ff0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
32000 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
32010 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
32020 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
32030 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
32040 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
32050 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
32060 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
32070 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
32080 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
32090 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
320a0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
320b0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
320c0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
320d0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
320e0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
320f0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
32100 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
32110 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
32120 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
32130 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
32140 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
32150 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
32160 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
32170 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
32180 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
32190 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
321a0 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
321b0 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
321c0 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
321d0 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
321e0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
321f0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
32200 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
32210 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
32220 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
32230 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
32240 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
32250 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
32260 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
32270 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
32280 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
32290 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
322a0 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
322b0 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
322c0 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
322d0 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
322e0 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
322f0 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
32300 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
32310 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
32320 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
32330 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
32340 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
32350 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
32360 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
32370 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
32380 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
32390 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
323a0 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
323b0 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
323c0 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
323d0 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
323e0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
323f0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
32400 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
32410 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
32420 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
32430 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
32440 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
32450 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
32460 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
32470 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
32480 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
32490 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
324a0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
324b0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
324c0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
324d0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
324e0 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
324f0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
32500 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
32510 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32520 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
32530 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
32540 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
32550 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
32560 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
32570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
32580 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
32590 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
325a0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
325b0 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  pgno, pgno, 0);.
325c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
325d0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
325e0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
325f0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
32600 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
32610 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
32620 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
32630 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
32640 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
32650 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
32660 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
32670 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
32680 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
32690 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
326a0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
326b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
326c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
326d0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
326e0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
326f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32700 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
32710 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
32720 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
32730 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
32740 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
32750 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
32760 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
32770 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
32780 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
32790 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
327a0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
327b0 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
327c0 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
327d0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
327e0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
327f0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
32800 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
32810 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
32820 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
32830 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
32840 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
32850 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
32860 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
32870 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
32880 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
32890 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
328a0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
328b0 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
328c0 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
328d0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
328e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
328f0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
32900 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
32910 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
32920 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
32930 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
32940 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
32950 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
32960 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
32970 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
32980 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
32990 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
329a0 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
329b0 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
329c0 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
329d0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
329e0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
329f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
32a00 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
32a10 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
32a20 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
32a30 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
32a40 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
32a50 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
32a60 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
32a70 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
32a80 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
32a90 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
32aa0 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
32ab0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
32ac0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
32ad0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
32ae0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
32af0 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70 4e  T;.      t = apN
32b00 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
32b10 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
32b20 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
32b30 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
32b40 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
32b50 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
32b60 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
32b70 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
32b80 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
32b90 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
32ba0 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
32bb0 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
32bc0 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
32bd0 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
32be0 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
32bf0 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
32c00 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
32c10 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
32c20 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
32c30 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
32c40 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
32c50 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
32c60 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
32c70 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
32c80 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
32c90 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
32ca0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32cb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32cc0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
32cd0 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
32ce0 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
32cf0 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
32d00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
32d10 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
32d20 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
32d30 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
32d40 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
32d50 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
32d60 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
32d70 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
32d80 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
32d90 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
32da0 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
32db0 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
32dc0 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
32dd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
32de0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
32df0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
32e00 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
32e10 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
32e20 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
32e30 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
32e40 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
32e50 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
32e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32e70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
32e80 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
32e90 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
32ea0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
32eb0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
32ec0 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
32ed0 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
32ee0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
32ef0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
32f00 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
32f10 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
32f20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
32f30 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
32f40 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
32f50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
32f60 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
32f70 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
32f80 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
32f90 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
32fa0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
32fb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
32fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
32fd0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32fe0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
32ff0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
33000 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
33010 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
33020 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
33030 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
33040 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
33050 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
33060 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
33070 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
33080 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
33090 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
330a0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
330b0 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
330c0 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
330d0 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
330e0 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
330f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
33100 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
33110 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
33120 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
33130 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
33140 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
33150 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
33160 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
33170 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
33180 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
33190 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
331a0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
331b0 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
331c0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
331d0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
331e0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
331f0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
33200 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
33210 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
33220 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
33230 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
33240 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
33250 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
33260 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
33270 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
33280 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
33290 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
332a0 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
332b0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
332c0 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
332d0 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
332e0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
332f0 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
33300 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
33310 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
33320 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
33330 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
33340 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
33350 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
33360 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
33370 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
33380 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
33390 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
333a0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
333b0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
333c0 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
333d0 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
333e0 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
333f0 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
33400 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
33410 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
33420 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
33430 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
33440 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
33450 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
33460 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
33470 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
33480 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
33490 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
334a0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
334b0 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
334c0 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
334d0 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
334e0 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
334f0 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
33500 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
33510 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
33520 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
33530 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
33540 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
33550 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
33560 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
33570 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33580 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
33590 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
335a0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
335b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
335c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
335d0 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d  iOvflSpace<=pBt-
335e0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
335f0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
33600 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
33610 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
33620 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  pNew->pgno, &rc)
33630 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33640 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
33650 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
33660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33670 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33680 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
33690 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
336a0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
336b0 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
336c0 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
336d0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
336e0 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
336f0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
33700 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
33710 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
33720 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
33730 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
33740 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
33750 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
33760 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
33770 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
33780 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f    }..  if( isRoo
33790 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  t && pParent->nC
337a0 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ell==0 && pParen
337b0 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70  t->hdrOffset<=ap
337c0 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b  New[0]->nFree ){
337d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
337e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
337f0 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  ree now contains
33800 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f   no cells. The o
33810 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nly sibling.    
33820 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72  ** page is the r
33830 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
33840 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74  e parent. Copy t
33850 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
33860 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20  he.    ** child 
33870 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
33880 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67  rent, decreasing
33890 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69   the overall hei
338a0 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ght of the.    *
338b0 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  * b-tree structu
338c0 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20  re by one. This 
338d0 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20  is described as 
338e0 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61  the "balance-sha
338f0 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73  llower".    ** s
33900 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20  ub-algorithm in 
33910 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69  some documentati
33920 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  on..    **.    *
33930 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
33940 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
33950 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74  base, the call t
33960 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  o copyNodeConten
33970 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73  t() .    ** sets
33980 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70   all pointer-map
33990 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70   entries corresp
339a0 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  onding to databa
339b0 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a  se image pages .
339c0 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68      ** for which
339d0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
339e0 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
339f0 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
33a00 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  copied..    **. 
33a10 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
33a20 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65   assert below ve
33a30 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  rifies that the 
33a40 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65  child page is de
33a50 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a  fragmented.    *
33a60 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61  * (it must be, a
33a70 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65  s it was just re
33a80 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e  constructed usin
33a90 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29  g assemblePage()
33aa0 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  ). This.    ** i
33ab0 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74  s important if t
33ac0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68  he parent page h
33ad0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67  appens to be pag
33ae0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
33af0 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65  ase.    ** image
33b00 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
33b10 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20  ( nNew==1 );.   
33b20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30   assert( apNew[0
33b30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20  ]->nFree == .   
33b40 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26       (get2byte(&
33b50 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b  apNew[0]->aData[
33b60 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65  5])-apNew[0]->ce
33b70 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30  llOffset-apNew[0
33b80 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20  ]->nCell*2) .   
33b90 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65   );.    copyNode
33ba0 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d  Content(apNew[0]
33bb0 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b  , pParent, &rc);
33bc0 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70  .    freePage(ap
33bd0 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20  New[0], &rc);.  
33be0 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f  }else if( ISAUTO
33bf0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a  VACUUM ){.    /*
33c00 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   Fix the pointer
33c10 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
33c20 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74   all the cells t
33c30 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64  hat were shifted
33c40 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a   around. .    **
33c50 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72   There are sever
33c60 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  al different typ
33c70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61  es of pointer-ma
33c80 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e  p entries that n
33c90 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
33ca0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
33cb0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d  his routine. Som
33cc0 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20  e of these have 
33cd0 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79  been set already
33ce0 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e  , but.    ** man
33cf0 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20  y have not. The 
33d00 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73  following is a s
33d10 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20  ummary:.    **. 
33d20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65     **   1) The e
33d30 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
33d40 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69  d with new sibli
33d50 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ng pages that we
33d60 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20  re not.    **   
33d70 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e     siblings when
33d80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
33d90 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65  as called. These
33da0 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
33db0 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73    **      been s
33dc0 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65  et. We don't nee
33dd0 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  d to worry about
33de0 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68   old siblings th
33df0 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20  at were.    **  
33e00 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65      moved to the
33e10 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65   free-list - the
33e20 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65   freePage() code
33e30 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a   has taken care.
33e40 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74      **      of t
33e50 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hose..    **.   
33e60 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69   **   2) The poi
33e70 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
33e80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33e90 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
33ea0 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  low.    **      
33eb0 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72  page in any over
33ec0 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64  flow chains used
33ed0 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20   by new divider 
33ee0 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20  cells. These .  
33ef0 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61    **      have a
33f00 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e  lso already been
33f10 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62   taken care of b
33f20 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c  y the insertCell
33f30 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a  () code..    **.
33f40 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74      **   3) If t
33f50 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
33f60 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
33f70 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
33f80 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  pages of.    ** 
33f90 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65       cells store
33fa0 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67  d on the sibling
33fb0 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20   pages may need 
33fc0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
33fd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34     **.    **   4
33fe0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
33ff0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69   pages are not i
34000 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
34010 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20  odes, then any. 
34020 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66     **      overf
34030 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62  low pages used b
34040 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61  y these cells ma
34050 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
34060 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ated.    **     
34070 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65   (internal intke
34080 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f  y nodes never co
34090 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
340a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
340b0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
340c0 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62     5) If the sib
340d0 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
340e0 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
340f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
34100 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72      **      entr
34110 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68  ies for the righ
34120 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  t-child pages of
34130 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61   each sibling ma
34140 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20  y need.    **   
34150 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64     to be updated
34160 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
34170 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72  Cases 1 and 2 ar
34180 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f  e dealt with abo
34190 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65  ve by other code
341a0 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  . The next.    *
341b0 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  * block deals wi
341c0 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34  th cases 3 and 4
341d0 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74   and the one aft
341e0 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e  er that, case 5.
341f0 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65   Since.    ** se
34200 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  tting a pointer 
34210 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72  map entry is a r
34220 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73  elatively expens
34230 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  ive operation, t
34240 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  his.    ** code 
34250 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
34260 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
34270 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  r child or overf
34280 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68  low pages that h
34290 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  ave.    ** actua
342a0 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65  lly moved betwee
342b0 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20  n pages.  */.   
342c0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
342d0 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d   apNew[0];.    M
342e0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
342f0 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e  pCopy[0];.    in
34300 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f  t nOverflow = pO
34310 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
34320 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20     int iNextOld 
34330 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  = pOld->nCell + 
34340 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
34350 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  nt iOverflow = (
34360 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64  nOverflow ? pOld
34370 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a  ->aOvfl[0].idx :
34380 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
34390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
343b0 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
343c0 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
343d0 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343f0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
34400 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
34410 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
34420 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
34430 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 69  {.      int isDi
34440 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  vider = 0;.     
34450 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74   while( i==iNext
34460 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Old ){.        /
34470 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20  * Cell i is the 
34480 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  cell immediately
34490 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
344a0 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a  ast cell on old.
344b0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69          ** sibli
344c0 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68  ng page j. If th
344d0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  e siblings are n
344e0 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  ot leaf pages of
344f0 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
34500 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68  ntkey b-tree, th
34510 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20  en cell i was a 
34520 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f  divider cell. */
34530 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  .        pOld = 
34540 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20  apCopy[++j];.   
34550 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20       iNextOld = 
34560 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
34570 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f  pOld->nCell + pO
34580 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
34590 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
345a0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
345b0 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f          nOverflo
345c0 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
345d0 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  low;.          i
345e0 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21  Overflow = i + !
345f0 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
34600 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20  >aOvfl[0].idx;. 
34610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34620 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65   isDivider = !le
34630 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20  afData;  .      
34640 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
34650 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69  nOverflow>0 || i
34660 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20  Overflow<i );.  
34670 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
34680 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<2 || pOld->
34690 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[0].idx==pO
346a0 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
346b0 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1);.      asser
346c0 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c  t(nOverflow<3 ||
346d0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e   pOld->aOvfl[1].
346e0 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
346f0 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [2].idx-1);.    
34700 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
34710 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
34720 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
34730 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
34740 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
34750 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
34760 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
34770 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
34780 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
34790 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
347a0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
347b0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
347c0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
347d0 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
347e0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
347f0 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
34800 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
34810 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
34820 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
34830 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
34840 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
34850 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
34860 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
34870 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
34880 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
34890 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
348a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
348b0 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
348c0 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
348d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
348e0 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
348f0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
34900 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
34910 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
34920 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
34930 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
34940 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
34950 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
34960 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
34970 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
34980 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
34990 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
349a0 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
349b0 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
349c0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
349d0 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
349e0 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
349f0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
34a00 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
34a10 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
34a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
34a30 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
34a40 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
34a50 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
34a60 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
34a70 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
34a80 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
34a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34aa0 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
34ab0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
34ac0 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
34ad0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
34ae0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
34af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34b00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
34b10 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
34b20 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
34b30 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
34b40 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
34b50 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
34b60 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
34b70 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
34b80 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
34b90 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
34ba0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
34bb0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
34bc0 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
34bd0 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
34be0 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
34bf0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
34c00 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
34c10 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
34c20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
34c30 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
34c40 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
34c50 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
34c60 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
34c70 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
34c80 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
34c90 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
34ca0 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
34cb0 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
34cc0 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
34cd0 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
34ce0 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
34cf0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
34d00 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
34d10 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
34d20 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
34d30 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
34d40 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
34d50 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
34d60 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
34d70 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
34d80 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
34d90 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
34da0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
34db0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34dc0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
34dd0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
34de0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
34df0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
34e00 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
34e10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
34e20 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
34e30 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
34e40 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
34e50 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
34e60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
34e70 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
34e80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
34e90 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
34ea0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
34eb0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
34ec0 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
34ed0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
34ee0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
34ef0 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
34f00 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
34f10 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
34f20 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
34f30 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
34f40 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
34f50 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
34f60 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
34f70 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
34f80 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
34f90 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
34fa0 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
34fb0 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
34fc0 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
34fd0 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
34fe0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
34ff0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
35000 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
35010 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
35020 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
35030 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
35040 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
35050 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
35060 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
35070 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
35080 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
35090 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
350a0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
350b0 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
350c0 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
350d0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
350e0 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
350f0 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
35100 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
35110 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
35120 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
35130 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
35140 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
35150 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
35160 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
35170 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
35180 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
35190 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
351a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
351b0 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
351c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
351d0 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
351e0 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
351f0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
35200 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
35210 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
35220 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35240 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35250 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
35260 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
35270 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
35280 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
35290 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
352a0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
352b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
352c0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
352d0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
352e0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
352f0 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
35300 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
35310 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
35320 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
35330 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
35340 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
35350 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
35360 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
35370 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
35380 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
35390 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
353a0 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
353b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
353c0 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
353d0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
353e0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
353f0 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
35400 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
35410 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
35420 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
35430 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
35440 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
35450 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35460 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
35470 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
35480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35490 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
354a0 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
354b0 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
354c0 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
354d0 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
354e0 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
354f0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
35500 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
35510 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
35520 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
35530 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
35540 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
35550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
35560 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
35570 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
35580 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
35590 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
355a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
355b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
355c0 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
355d0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
355e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
355f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
35600 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
35610 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
35620 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
35630 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
35640 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
35650 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
35660 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
35670 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
35680 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
35690 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
356a0 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
356b0 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
356c0 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
356d0 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52  pRoot->aOvfl, pR
356e0 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  oot->nOverflow*s
356f0 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76  izeof(pRoot->aOv
35700 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
35710 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
35720 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Root->nOverflow;
35730 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
35740 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f  contents of pRoo
35750 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20  t. Then install 
35760 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69  pChild as the ri
35770 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20  ght-child. */.  
35780 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
35790 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
357a0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
357b0 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74   put4byte(&pRoot
357c0 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
357d0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
357e0 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43  oChild);..  *ppC
357f0 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20  hild = pChild;. 
35800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35810 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
35820 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
35830 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
35840 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
35850 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
35860 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
35870 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
35880 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
35890 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
358a0 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
358b0 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
358c0 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
358d0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
358e0 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
358f0 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e  outine. Balancin
35900 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a  g routines are:.
35910 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  **.**   balance_
35920 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c  quick().**   bal
35930 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a  ance_deeper().**
35940 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f     balance_nonro
35950 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ot().*/.static i
35960 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
35970 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
35980 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35990 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
359a0 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
359b0 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
359c0 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
359d0 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
359e0 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
359f0 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
35a00 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
35a10 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
35a20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
35a30 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
35a40 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
35a50 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
35a60 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
35a70 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
35a80 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
35a90 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
35aa0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
35ab0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
35ac0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
35ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
35ae0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
35af0 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
35b00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
35b10 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
35b20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
35b30 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
35b40 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
35b50 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
35b60 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
35b70 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
35b80 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
35b90 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
35ba0 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
35bb0 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
35bc0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
35bd0 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
35be0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
35bf0 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
35c00 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
35c10 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
35c20 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
35c30 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
35c40 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
35c50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
35c60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35c70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35c80 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
35c90 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
35ca0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
35cb0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
35cc0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
35cd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
35ce0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
35cf0 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
35d00 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
35d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35d30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
35d40 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35d50 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
35d60 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20  nFree<=nMin ){. 
35d70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d  }else{.      Mem
35d90 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61  Page * const pPa
35da0 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
35db0 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20  age[iPage-1];.  
35dc0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49      int const iI
35dd0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
35de0 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20  [iPage-1];..    
35df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35e00 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
35e10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35e20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35e30 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  _OK ){.#ifndef S
35e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
35e50 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20  BALANCE.        
35e60 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
35e70 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ta.         && p
35e80 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
35e90 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
35ea0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
35eb0 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
35ec0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
35ed0 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20  rent->pgno!=1.  
35ee0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
35ef0 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20  t->nCell==iIdx. 
35f00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
35f10 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61      /* Call bala
35f20 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63  nce_quick() to c
35f30 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c  reate a new sibl
35f40 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20  ing of pPage on 
35f50 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20  which.          
35f60 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
35f70 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62  overflow cell. b
35f80 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
35f90 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c  nserts a new cel
35fa0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  l.          ** i
35fb0 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69  nto pParent, whi
35fc0 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
35fd0 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49  rent overflow. I
35fe0 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
35ff0 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
36000 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e   next interation
36010 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
36020 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61  will balance pPa
36030 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20  rent .          
36040 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61  ** use either ba
36050 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
36060 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  or balance_deepe
36070 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a  r(). Until this.
36080 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
36090 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c  pens, the overfl
360a0 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65  ow cell is store
360b0 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63  d in the aBalanc
360c0 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20  eQuickSpace[].  
360d0 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
360e0 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  r. .          **
360f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
36100 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
36110 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
36120 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20  t() is to check 
36130 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20  that only a.    
36140 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
36150 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
36160 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20  quick() is made 
36170 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
36180 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
36190 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  ** function. If 
361a0 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65  this were not ve
361b0 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65  rified, a subtle
361c0 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72   bug involving r
361d0 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  euse.          *
361e0 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63  * of the aBalanc
361f0 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69  eQuickSpace[] mi
36200 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20  ght sneak in..  
36210 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
36220 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
36230 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
36240 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
36250 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
36260 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74  ce_quick(pParent
36270 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63  , pPage, aBalanc
36280 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20  eQuickSpace);.  
36290 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
362a0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
362b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
362c0 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c  s case, call bal
362d0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74  ance_nonroot() t
362e0 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63  o redistribute c
362f0 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
36300 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20  * between pPage 
36310 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69  and up to 2 of i
36320 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ts sibling pages
36330 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a  . This involves.
36340 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64            ** mod
36350 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
36360 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20  nts of pParent, 
36370 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
36380 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20  pParent to.     
36390 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f       ** become o
363a0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
363b0 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69  full. The next i
363c0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
363d0 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20  do-loop.        
363e0 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63    ** will balanc
363f0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
36400 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69  e to correct thi
36410 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s..          ** 
36420 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
36430 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36440 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
36450 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  l, the overflow 
36460 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20  cell or cells.  
36470 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73          ** are s
36480 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70  tored in the pSp
36490 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  ace buffer alloc
364a0 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ated immediately
364b0 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20   below. .       
364c0 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65     ** A subseque
364d0 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  nt iteration of 
364e0 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
364f0 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20   deal with this 
36500 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
36510 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f  calling balance_
36520 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e  nonroot() (balan
36530 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20  ce_deeper() may 
36540 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c  be called first,
36550 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
36560 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61  t it doesn't dea
36570 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  l with overflow 
36580 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76  cells - just mov
36590 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20  es them to a.   
365a0 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72         ** differ
365b0 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20  ent page). Once 
365c0 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20  this subsequent 
365d0 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
365e0 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20  nonroot() .     
365f0 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70       ** has comp
36600 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66  leted, it is saf
36610 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
36620 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75   pSpace buffer u
36630 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20  sed by.         
36640 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73   ** the previous
36650 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76   call, as the ov
36660 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61  erflow cell data
36670 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
36680 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
36690 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f  pied either into
366a0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64   the body of a d
366b0 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20  atabase page or 
366c0 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
366d0 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65         ** pSpace
366e0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
366f0 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c  o the latter cal
36700 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
36710 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20  root()..        
36720 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
36730 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69  8 *pSpace = sqli
36740 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43  te3PageMalloc(pC
36750 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
36760 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
36770 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
36780 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ot(pParent, iIdx
36790 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d  , pSpace, iPage=
367a0 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  =1);.          i
367b0 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
367c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
367d0 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ree is not NULL,
367e0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
367f0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36800 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  used .          
36810 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f    ** by a previo
36820 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  us call to balan
36830 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74  ce_nonroot(). It
36840 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20  s contents are. 
36850 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f             ** no
36860 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72 20  w stored either 
36870 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73 65  on real database
36880 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e   pages or within
36890 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
368a0 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20    ** new pSpace 
368b0 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61  buffer, so it ma
368c0 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65 65  y be safely free
368d0 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  d here. */.     
368e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
368f0 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
36900 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
36910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70        /* The pSp
36920 61 63 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20  ace buffer will 
36930 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20 74  be freed after t
36940 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a  he next call to.
36950 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c            ** bal
36960 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20  ance_nonroot(), 
36970 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  or just before t
36980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
36990 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a  urns, whichever.
369a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d            ** com
369b0 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  es first. */.   
369c0 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
369d0 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  Space;.        }
369e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
369f0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36a00 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
36a10 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  The next iterati
36a20 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
36a30 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70  p balances the p
36a40 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20  arent page. */. 
36a50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
36a60 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  (pPage);.      p
36a70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
36a80 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
36a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
36aa0 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
36ab0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
36ac0 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  ee(pFree);.  }. 
36ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
36ae0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
36af0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
36b00 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
36b10 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
36b20 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
36b30 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
36b40 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
36b50 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
36b60 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
36b70 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
36b80 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
36b90 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
36ba0 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
36bb0 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
36bc0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
36bd0 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
36be0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
36bf0 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
36c00 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
36c10 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
36c20 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
36c30 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
36c40 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
36c50 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
36c60 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
36c70 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
36c80 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
36c90 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
36ca0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63  ero, then a succ
36cb0 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a  essful call to.*
36cc0 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  * MovetoUnpacked
36cd0 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f  () to seek curso
36ce0 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c  r pCur to (pKey,
36cf0 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61   nKey) has alrea
36d00 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f  dy.** been perfo
36d10 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74  rmed. seekResult
36d20 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20 72   is the search r
36d30 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28  esult returned (
36d40 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75  a negative.** nu
36d50 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f 69  mber if pCur poi
36d60 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20  nts at an entry 
36d70 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  that is smaller 
36d80 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79  than (pKey, nKey
36d90 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74  ), or.** a posit
36da0 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43 75  ive value if pCu
36db0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
36dc0 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72 67  try that is larg
36dd0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65  er than .** (pKe
36de0 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a  y, nKey)). .**.*
36df0 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
36e00 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
36e10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36e20 74 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  the caller guara
36e30 6e 74 65 65 73 20 74 68 61 74 0a 2a 2a 20 63 75  ntees that.** cu
36e40 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
36e50 6e 74 69 6e 67 20 61 74 20 74 68 65 20 65 78 69  nting at the exi
36e60 73 74 69 6e 67 20 63 6f 70 79 20 6f 66 20 61 20  sting copy of a 
36e70 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f 20 62  row that is to b
36e80 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e  e.** overwritten
36e90 2e 20 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  .  If the seekRe
36ea0 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
36eb0 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  s 0, then cursor
36ec0 20 70 43 75 72 20 6d 61 79 0a 2a 2a 20 70 6f 69   pCur may.** poi
36ed0 6e 74 20 74 6f 20 61 6e 79 20 65 6e 74 72 79 20  nt to any entry 
36ee0 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61  or to no entry a
36ef0 74 20 61 6c 6c 20 61 6e 64 20 73 6f 20 74 68 69  t all and so thi
36f00 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  s function has t
36f10 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75  o seek.** the cu
36f20 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20  rsor before the 
36f30 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69  new key can be i
36f40 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
36f50 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
36f60 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rt(.  BtCursor *
36f70 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
36f80 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
36f90 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ata into the tab
36fa0 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f  le of this curso
36fb0 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  r */.  const voi
36fc0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
36fd0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
36fe0 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
36ff0 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
37000 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
37010 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61  Data,  /* The da
37020 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ta of the new re
37030 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  cord */.  int nZ
37040 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
37050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37060 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79  er of extra 0 by
37070 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
37080 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61   data */.  int a
37090 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20  ppendBias,      
370a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
370b0 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
370c0 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f  ely an append */
370d0 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c  .  int seekResul
370e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
370f0 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70    /* Result of p
37100 72 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63  rior MovetoUnpac
37110 6b 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b  ked() call */.){
37120 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
37130 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c   loc = seekResul
37140 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d  t;          /* -
37150 31 3a 20 62 65 66 6f 72 65 20 64 65 73 69 72 65  1: before desire
37160 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31 3a 20  d location  +1: 
37170 61 66 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  after */.  int s
37180 7a 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zNew = 0;.  int 
37190 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
371a0 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
371b0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
371c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
371d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
371e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
371f0 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
37200 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
37210 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   0;..  if( pCur-
37220 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
37230 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73  FAULT ){.    ass
37240 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
37250 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
37260 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  ;.    return pCu
37270 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
37280 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
37290 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
372a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
372b0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
372c0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
372d0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
372e0 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
372f0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  y );.  assert( h
37300 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
37310 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e  leLock(p, pCur->
37320 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e  pgnoRoot, pCur->
37330 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20  pKeyInfo!=0, 2) 
37340 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
37350 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
37360 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73 74  has been consist
37370 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75 72  ent. If this cur
37380 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a 20  sor was opened. 
37390 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61 6e   ** expecting an
373a0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 74   index b-tree, t
373b0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73  hen the caller s
373c0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
373d0 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79  ng blob.  ** key
373e0 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63 69  s with no associ
373f0 61 74 65 64 20 64 61 74 61 2e 20 49 66 20 74 68  ated data. If th
37400 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
37410 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20 61 6e  ned expecting an
37420 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  .  ** intkey tab
37430 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  le, the caller s
37440 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
37450 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  ng integer keys 
37460 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62  with a.  ** blob
37470 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 64   of associated d
37480 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ata.  */.  asser
37490 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70  t( (pKey==0)==(p
374a0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
374b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
374c0 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20  is is an insert 
374d0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
374e0 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  ree, invalidate 
374f0 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20  any incrblob .  
37500 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
37510 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  on the row being
37520 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d   replaced (assum
37530 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65  ing this is a re
37540 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61  place.  ** opera
37550 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20  tion - if it is 
37560 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  not, the followi
37570 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20  ng is a no-op). 
37580 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
37590 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
375a0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
375b0 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
375c0 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
375d0 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
375e0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
375f0 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
37600 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
37610 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
37620 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
37630 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f  l to btreeMoveto
37640 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f  () below is a no
37650 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78  -op. For.  ** ex
37660 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65  ample, when inse
37670 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20  rting data into 
37680 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74  a table with aut
37690 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65  o-generated inte
376a0 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74  ger.  ** keys, t
376b0 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e  he VDBE layer in
376c0 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72  vokes sqlite3Btr
376d0 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75  eeLast() to figu
376e0 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a  re out the .  **
376f0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20   integer key to 
37700 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c  use. It then cal
37710 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
37720 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73   to actually ins
37730 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ert the .  ** da
37740 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b  ta into the intk
37750 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  ey B-Tree. In th
37760 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76  is case btreeMov
37770 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
37780 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
37790 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
377a0 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
377b0 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
377c0 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
377d0 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
377e0 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
377f0 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
37800 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
37810 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
37820 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
37830 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
37840 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
37850 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
37860 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b  pgnoRoot, pCur);
37870 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
37880 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f  rn rc;.  if( !lo
37890 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  c ){.    rc = bt
378a0 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
378b0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
378c0 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20  ndBias, &loc);. 
378d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
378e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
378f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
37900 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
37910 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65  || (pCur->eState
37920 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
37930 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70   && loc) );..  p
37940 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
37950 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
37960 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37970 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
37980 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
37990 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
379a0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
379b0 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49 4e  );..  TRACE(("IN
379c0 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
379d0 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
379e0 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
379f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
37a00 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
37a10 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
37a20 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
37a30 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
37a40 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
37a50 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
37a60 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
37a70 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
37a80 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43  ace(pBt);.  newC
37a90 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
37aa0 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43  pace;.  if( newC
37ab0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
37ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
37ad0 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
37ae0 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20  pPage, newCell, 
37af0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74  pKey, nKey, pDat
37b00 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c  a, nData, nZero,
37b10 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
37b20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
37b30 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
37b40 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
37b50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
37b60 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
37b70 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
37b80 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64  IZE(pBt) );.  id
37b90 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
37ba0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
37bb0 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20  if( loc==0 ){.  
37bc0 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
37bd0 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
37be0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
37bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37c00 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
37c10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
37c20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
37c30 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
37c40 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
37c50 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
37c60 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  , idx);.    if( 
37c70 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37c80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
37c90 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
37ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
37cb0 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
37cc0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
37cd0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
37ce0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
37cf0 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43 65  ell);.    dropCe
37d00 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
37d10 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  zOld, &rc);.    
37d20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
37d30 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  d_insert;.  }els
37d40 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
37d50 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
37d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37d70 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
37d80 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
37d90 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
37da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
37db0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
37dc0 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65  af );.  }.  inse
37dd0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
37de0 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
37df0 77 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20  w, 0, 0, &rc);. 
37e00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
37e10 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
37e20 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
37e30 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
37e40 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
37e50 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
37e60 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
37e70 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
37e80 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
37e90 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
37ea0 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
37eb0 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
37ec0 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
37ed0 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
37ee0 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
37ef0 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
37f00 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
37f10 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
37f20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
37f30 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
37f40 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
37f50 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
37f60 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
37f70 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
37f80 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
37f90 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
37fa0 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
37fb0 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
37fc0 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
37fd0 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
37fe0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
37ff0 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
38000 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
38010 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
38020 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
38030 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
38040 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
38050 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
38060 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
38070 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
38080 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
38090 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
380a0 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
380b0 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
380c0 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
380d0 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
380e0 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
380f0 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
38100 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
38110 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
38120 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
38130 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
38140 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
38150 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
38160 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
38170 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
38180 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
38190 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
381a0 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
381b0 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
381c0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
381d0 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
381e0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
381f0 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
38200 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
38210 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
38220 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
38230 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
38240 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
38250 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
38260 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
38270 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
38280 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
38290 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
382a0 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
382b0 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
382c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
382d0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
382e0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
382f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
38300 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
38310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
38320 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
38330 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
38340 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
38350 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
38360 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
38370 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
38380 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
38390 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
383a0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
383b0 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
383c0 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
383d0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
383e0 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
383f0 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
38400 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
38410 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
38420 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
38430 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
38440 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
38450 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
38460 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
38470 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
38480 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
38490 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
384a0 20 7d 0a 20 20 61 73 73 65 7