/ Hex Artifact Content
Login

Artifact 2d943dc55e9828b017a2f3fe696a54ff91f51eaf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5690: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
56a0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
56b0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
56c0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
56d0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
56e0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
56f0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
5700: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
5710: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
5720: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
5730: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
5740: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5770: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5780: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5790: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
57a0: 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  dxKey);.  }else{
57b0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
57c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
57d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57e0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57f0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
5800: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
5810: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
5820: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
5830: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
5840: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
5850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5860: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
5870: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
5880: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
5890: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
58a0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
58b0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
58c0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
58d0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
58e0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
58f0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
5900: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
5910: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
5920: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
5930: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
5940: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
5950: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
5960: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5970: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5990: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
59a0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
59d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
59e0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59f0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5a00: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5a10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5a20: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
5a30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
5a40: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
5a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
5a60: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
5a70: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a80: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5a90: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
5aa0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ab0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5ac0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
5ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
5ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
5b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
5b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
5b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
5b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
5b70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5b80: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
5b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
5ba0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
5bb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5bc0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
5bd0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
5bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
5c00: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
5c10: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
5c20: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5c30: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5c40: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5c50: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5c60: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5c70: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5c80: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5c90: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5ca0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5cb0: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5cd0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
5ce0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
5cf0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
5d00: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
5d10: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
5d20: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5d30: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5d40: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5d60: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5d70: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5d80: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5d90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5da0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5db0: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5dc0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
5dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
5e00: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
5e10: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e  D || pCur->skipN
5e20: 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext!=0 ){.    *p
5e30: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5e50: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
5e80: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 69 73   a btree page is
5e90: 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74   writable..*/.st
5ea0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 61  atic int btreeMa
5eb0: 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28  kePageWriteable(
5ec0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
5ed0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
5ee0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
5ef0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
5f00: 70 44 62 50 61 67 65 29 20 29 20 72 65 74 75 72  pDbPage) ) retur
5f10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  n SQLITE_OK;.  r
5f20: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
5f30: 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
5f40: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
5f50: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
5f60: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
5f70: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 70  e->pDbPage);.  p
5f80: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
5f90: 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
5fa0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5fb0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
5fc0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 70 50 61  >aCellIdx = &pPa
5fd0: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
5fe0: 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  >cellOffset];.  
5ff0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
6000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6010: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
6020: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
6030: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
6040: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
6050: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
6060: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
6070: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
6080: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
6090: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
60a0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
60b0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
60c0: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
60d0: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
60e0: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
60f0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6100: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6110: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6120: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6130: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6140: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
6150: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
6160: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
6170: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
6180: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6190: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
61a0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
61b0: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
61c0: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
61d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
61e0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
61f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6200: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6210: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6220: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6230: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6240: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
6250: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
6260: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
6270: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
6280: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
6290: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
62a0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
62b0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
62c0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
62d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
62e0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
62f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6310: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6320: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6330: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6340: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
6350: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
6360: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
6370: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
6380: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
6390: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
63a0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
63b0: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
63c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
63d0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
63e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
63f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6400: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6410: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6430: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6440: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6450: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
6460: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
6470: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
6480: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
6490: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
64a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
64b0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
64c0: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
64d0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
64e0: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
64f0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6500: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6520: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6530: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6540: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6550: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
6560: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
6570: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
6580: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
6590: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
65a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
65b0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
65c0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
65d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
65e0: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
65f0: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6600: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6610: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6620: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6630: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6640: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
6650: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
6660: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
6670: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6680: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6690: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
66a0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
66b0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
66c0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
66d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
66e0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
66f0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6700: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6710: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6720: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6730: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6740: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
6750: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
6760: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
6770: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6780: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6790: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
67a0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
67b0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
67c0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
67d0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
67e0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
67f0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6800: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6810: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6820: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6830: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6840: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
6850: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
6860: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
6870: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
6880: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6890: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
68a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
68b0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
68c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
68d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
68e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
68f0: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6900: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6910: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6920: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6930: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6940: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6950: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
6960: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
6970: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
6980: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6990: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
69a0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
69b0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
69c0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
69d0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
69e0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
69f0: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6a00: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6a10: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6a20: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6a30: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6a40: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6a50: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
6a60: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6a70: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
6a80: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6a90: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6aa0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6ab0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6ac0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6ad0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6ae0: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6af0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6b00: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6b10: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6b20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6b30: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6b40: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6b50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6b60: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6b70: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6b80: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6ba0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6bb0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6bc0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6bd0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6be0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6bf0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6c00: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6c10: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6c20: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6c30: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
6c40: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6c50: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6c60: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
6c70: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
6c80: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6c90: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6ca0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
6cb0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6cc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6cd0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ce0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6cf0: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6d00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6d10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6d20: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6d30: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6d40: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6d50: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6d60: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6d70: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6d80: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6d90: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
6da0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
6db0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
6dc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6dd0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
6de0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
6df0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
6e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6e10: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6e20: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6e30: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
6e40: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
6e50: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6e60: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6e70: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
6e80: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
6e90: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
6ea0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
6eb0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
6ec0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
6ed0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
6ee0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
6ef0: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
6f00: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
6f10: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6f20: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
6f30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6f40: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
6f50: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
6f60: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
6f70: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
6f80: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
6f90: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
6fa0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
6fb0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
6fc0: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
6fd0: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
6fe0: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
6ff0: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
7000: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
7010: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
7020: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
7030: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
7040: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
7050: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
7060: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
7070: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
7080: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
7090: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
70a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
70b0: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
70c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
70d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
70e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
70f0: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7100: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7110: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7120: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
7130: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
7140: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
7150: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
7160: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
7170: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
7180: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
7190: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
71a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
71b0: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
71c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
71d0: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
71e0: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
71f0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
7200: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
7210: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
7220: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
7230: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
7240: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
7250: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
7260: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
7270: 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65  ion.  btreeParse
7280: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
7290: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
72a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
72b0: 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61  ment and btreePa
72c0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
72d0: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
72e0: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
72f0: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
7300: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
7310: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
7320: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
7330: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
7340: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
7350: 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65  tead of.** btree
7360: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
7370: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
7380: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
7390: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74  be faster..*/.st
73a0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
73b0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
73c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
73d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
73e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
73f0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
7400: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7410: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
7420: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
7430: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
7440: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
7450: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
7460: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ure */.){.  u16 
7470: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
7480: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
7490: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
74a0: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
74b0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
74c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
74d0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
74e0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
74f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7500: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7510: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7520: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
7530: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
7540: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
7550: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
7560: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
7570: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
7580: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
7590: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
75a0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
75b0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
75c0: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
75d0: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
75e0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
75f0: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
7600: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7610: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7620: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7630: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7640: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
7650: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
7660: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
7670: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
7680: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7690: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
76a0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
76b0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
76c0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
76d0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
76e0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
76f0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7700: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7710: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7720: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7730: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7740: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
7750: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
7760: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
7770: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
7780: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
7790: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
77a0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
77b0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
77c0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
77d0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
77e0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
77f0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7800: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7810: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7820: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7830: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7840: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
7850: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
7860: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7870: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7880: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7890: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
78a0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
78b0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
78c0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
78d0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
78e0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
78f0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7900: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7910: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7920: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7930: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7940: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
7950: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
7960: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
7970: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
7980: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
7990: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
79a0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
79b0: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
79c0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
79d0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
79e0: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
79f0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7a00: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7a10: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7a20: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7a30: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7a40: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
7a50: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
7a60: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
7a70: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
7a80: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
7a90: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7aa0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7ab0: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7ac0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7ad0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ae0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7af0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7b00: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7b10: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7b20: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7b30: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7b40: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7b50: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7b60: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7b70: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7b80: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7b90: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7ba0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7bb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7bc0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7bd0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7be0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7bf0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7c00: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7c10: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
7c20: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
7c30: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
7c40: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
7c50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7c60: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7c70: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
7c80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
7c90: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
7ca0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
7cb0: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
7cc0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
7cd0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
7ce0: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
7cf0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7d00: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
7d10: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
7d20: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
7d30: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
7d40: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
7d50: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
7d60: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
7d70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7d80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7d90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7da0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
7db0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
7dc0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
7dd0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
7de0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
7df0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
7e00: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
7e10: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
7e20: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
7e30: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7e40: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
7e50: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
7e60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
7e70: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
7e80: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
7e90: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
7ea0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
7eb0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
7ec0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
7ed0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
7ee0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
7ef0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
7f00: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
7f10: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
7f20: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
7f30: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
7f40: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
7f50: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
7f60: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
7f70: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
7f80: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
7f90: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
7fa0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
7fb0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7fc0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
7fd0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
7fe0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
7ff0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
8000: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
8010: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
8020: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
8030: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
8040: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
8050: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
8060: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
8070: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
8080: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
8090: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
80a0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
80b0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
80c0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
80d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
80e0: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
80f0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8100: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8110: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8120: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8130: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8140: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
8150: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8160: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8170: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8180: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
8190: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
81a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
81b0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
81c0: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
81d0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
81e0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
81f0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8200: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8210: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8220: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8230: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8240: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
8250: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
8260: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
8270: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8280: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8290: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
82a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
82b0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
82c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
82d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
82e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
82f0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8300: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8310: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8320: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8330: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8340: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
8350: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
8360: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8370: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
8380: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
8390: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
83a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
83b0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
83c0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
83d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
83e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
83f0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8400: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8410: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8420: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8430: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8440: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
8450: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
8460: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
8470: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8480: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
8490: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
84a0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
84b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
84c0: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
84d0: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
84e0: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
84f0: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8500: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8510: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8520: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8530: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8540: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
8550: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
8560: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8570: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
8580: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
8590: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
85a0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
85b0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
85c0: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
85d0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
85e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
85f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8600: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8610: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8620: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8630: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8640: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8650: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
8660: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
8670: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
8680: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
8690: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
86a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
86b0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
86c0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
86d0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
86e0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
86f0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8700: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8710: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8720: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8730: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8740: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8750: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8760: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8770: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8780: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8790: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
87a0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
87b0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
87c0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
87d0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
87e0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
87f0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8800: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8810: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8820: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8830: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8840: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
8850: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
8860: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
8870: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
8880: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
8890: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
88a0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
88b0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
88c0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
88d0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
88e0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
88f0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8900: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8920: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8930: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8940: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8960: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8970: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
8980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8990: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
89a0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
89b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
89c0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
89d0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
89e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8a10: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8a20: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8a30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8a40: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
8a50: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
8a60: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
8a70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8a80: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
8a90: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
8aa0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8ac0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8ad0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8ae0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8b10: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8b20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8b30: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8b40: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8b50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8b60: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8b70: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8b80: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8b90: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8bb0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8bc0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8bd0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8bf0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
8c00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
8c10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8c20: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
8c30: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8c40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8c50: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
8c60: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8c70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
8c80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
8c90: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
8ca0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
8cb0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
8cc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8cd0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8ce0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
8cf0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
8d00: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
8d10: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
8d20: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
8d30: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
8d40: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
8d50: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
8d60: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
8d70: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
8d80: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
8d90: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
8da0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
8db0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
8dc0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
8dd0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
8de0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
8df0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
8e00: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
8e10: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
8e20: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
8e30: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
8e40: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
8e50: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
8e60: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
8e70: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
8e80: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
8e90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
8ea0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
8eb0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
8ec0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
8ed0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
8ee0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
8ef0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
8f00: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
8f10: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
8f20: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
8f30: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
8f40: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
8f50: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
8f60: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
8f70: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
8f80: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
8f90: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
8fa0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
8fb0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
8fc0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
8fd0: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
8fe0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8ff0: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
9000: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
9010: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
9020: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
9030: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9040: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9050: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9070: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
9080: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
9090: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
90a0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
90b0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
90c0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
90d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
90e0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
90f0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9100: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9110: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9120: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9130: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9140: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
9150: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
9160: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
9170: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
9180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9190: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
91a0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
91b0: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
91c0: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
91d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
91e0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
91f0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9200: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9210: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9220: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9230: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9240: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
9250: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
9260: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
9270: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
9280: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
9290: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
92a0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
92b0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
92c0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
92d0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
92e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
92f0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9300: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9310: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9320: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9330: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9340: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9350: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
9360: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
9370: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
9380: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9390: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
93a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
93b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
93c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
93d0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
93e0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
93f0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9400: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9410: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9420: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9430: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9440: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
9450: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
9460: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
9470: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
9480: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
9490: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
94a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
94b0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
94c0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
94d0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
94e0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
94f0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9500: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9510: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9520: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9530: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9540: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
9550: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
9560: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
9570: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
9580: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
9590: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
95a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
95b0: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
95c0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
95d0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
95e0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
95f0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9600: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9610: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9620: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9630: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9640: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
9650: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
9660: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
9670: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
9680: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
9690: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
96a0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
96b0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
96c0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
96d0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
96e0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
96f0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9700: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b   */.  int nFrag;
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9740: 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74  mber of fragment
9750: 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67  ed bytes on pPag
9760: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  e */.  int top; 
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9790: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
97a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
97b0: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
97c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
97d0: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
97e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
97f0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
9800: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
9810: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9820: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
9830: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9840: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
9850: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
9860: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
9870: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
9880: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
9890: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
98a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
98b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
98c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
98d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
98e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
98f0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
9900: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9910: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
9920: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
9930: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
9940: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
9950: 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65  w==0 );.  usable
9960: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
9970: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
9980: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
9990: 20 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b   usableSize-8 );
99a0: 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61  ..  nFrag = data
99b0: 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72  [hdr+7];.  asser
99c0: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
99d0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
99e0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
99f0: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
9a00: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
9a10: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
9a20: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9a30: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
9a40: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
9a50: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
9a60: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9a70: 54 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  T;.  testcase( g
9a80: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
9a90: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
9aa0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9ab0: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a  e( gap==top );..
9ac0: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
9ad0: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ){.    /* Always
9ae0: 20 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68   defragment high
9af0: 6c 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61  ly fragmented pa
9b00: 67 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ges */.    rc = 
9b10: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9b20: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
9b30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9b40: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
9b50: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
9b60: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
9b70: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
9b80: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
9b90: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
9ba0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
9bb0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9bc0: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9bd0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9be0: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9bf0: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9c00: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9c10: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9c20: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9c30: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9c40: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9c50: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
9c60: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
9c70: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
9c80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9c90: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
9ca0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
9cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9cc0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9cd0: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9ce0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9cf0: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9d00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9d10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9d30: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9d40: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
9d60: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
9d70: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
9d80: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
9d90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
9da0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
9db0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9dc0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9dd0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9de0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9df0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9e00: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9e10: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9e20: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9e30: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9e40: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9e50: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9e60: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
9e70: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
9e80: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
9e90: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
9ea0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9eb0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9ec0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9ed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ee0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9ef0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9f00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9f10: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9f20: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9f30: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9f40: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9f50: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9f60: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9f70: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9f80: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9f90: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9fa0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9fb0: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9fc0: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9fd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9fe0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9ff0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
a000: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
a010: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
a020: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
a030: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
a040: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
a050: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
a060: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
a070: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
a080: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
a090: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
a0a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
a0b0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
a0c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
a0d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a0e0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
a0f0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
a100: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
a110: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
a120: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
a130: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
a140: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
a150: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
a160: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
a170: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
a180: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
a190: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
a1a0: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
a1b0: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
a1c0: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
a1d0: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
a1e0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
a1f0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
a200: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
a210: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
a220: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
a230: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
a240: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
a250: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
a260: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
a270: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
a280: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
a290: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a2a0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
a2b0: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
a2c0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a2d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a2e0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
a2f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a300: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a310: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a320: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a330: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a340: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
a350: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
a360: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
a370: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
a380: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
a390: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
a3a0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
a3b0: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
a3c0: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
a3d0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
a3e0: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
a3f0: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
a400: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
a410: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
a420: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
a430: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
a440: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
a450: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
a460: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
a470: 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  hdr;.  int iLast
a480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
a4a0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
a4b0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
a4c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a4d0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
a4e0: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
a4f0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a510: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a520: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a530: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
a540: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
a550: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
a560: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
a570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
a580: 61 72 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28  art + size) <= (
a590: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
a5a0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a5b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a5c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
a5d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
a5e0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e  .  assert( size>
a5f0: 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =0 );   /* Minim
a600: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
a610: 34 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  4 */..  if( pPag
a620: 65 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  e->pBt->secureDe
a630: 6c 65 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  lete ){.    /* O
a640: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
a650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
a660: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
a670: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
a680: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20     ** option is 
a690: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  enabled */.    m
a6a0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
a6b0: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20  t], 0, size);.  
a6c0: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
a6d0: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
a6e0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
a6f0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  of freeblocks.  
a700: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65  Note that.  ** e
a710: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
a720: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
a730: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
a740: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20  eeInitPage(),.  
a750: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
a760: 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63  () did not detec
a770: 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65  t overlapping ce
a780: 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65  lls or.  ** free
a790: 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72  blocks that over
a7a0: 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20  lapped cells.   
a7b0: 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74 65  Nor does it dete
a7c0: 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ct when the.  **
a7d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a7e0: 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20 76  ea exceeds the v
a7f0: 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67 65  alue in the page
a800: 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68 65   header.  If the
a810: 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f  se.  ** situatio
a820: 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73  ns arise, then s
a830: 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74  ubsequent insert
a840: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68   operations migh
a850: 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74  t corrupt.  ** t
a860: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f  he freelist.  So
a870: 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63   we do need to c
a880: 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74  heck for corrupt
a890: 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69  ion while scanni
a8a0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  ng.  ** the free
a8b0: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  list..  */.  hdr
a8c0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
a8d0: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
a8e0: 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d  r + 1;.  iLast =
a8f0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
a900: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61  bleSize - 4;.  a
a910: 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c  ssert( start<=iL
a920: 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ast );.  while( 
a930: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a940: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a950: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
a960: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62  >0 ){.    if( pb
a970: 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20  egin<addr+4 ){. 
a980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a990: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
a9b0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
a9c0: 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74  if( pbegin>iLast
a9d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a9e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a9f0: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
aa00: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
aa10: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
aa20: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
aa30: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
aa40: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
aa50: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
aa60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
aa70: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
aa80: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
aa90: 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20   = pPage->nFree 
aaa0: 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20  + (u16)size;..  
aab0: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
aac0: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
aad0: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72   */.  addr = hdr
aae0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
aaf0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
ab00: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
ab10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
ab20: 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20  xt, psize, x;.  
ab30: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
ab40: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
ab50: 65 72 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28  ert( pbegin <= (
ab60: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
ab70: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
ab80: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
ab90: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
aba0: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
abb0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
abc0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
abd0: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
abe0: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
abf0: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
ac00: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
ac10: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
ac20: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  size);.      if(
ac30: 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72   (frag<0) || (fr
ac40: 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72  ag>(int)data[hdr
ac50: 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  +7]) ){.        
ac60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ac70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ac80: 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68    }.      data[h
ac90: 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61  dr+7] -= (u8)fra
aca0: 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  g;.      x = get
acb0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
acc0: 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  t]);.      put2b
acd0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ace0: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d  ], x);.      x =
acf0: 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74   pnext + get2byt
ad00: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
ad10: 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  ) - pbegin;.    
ad20: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ad30: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a  [pbegin+2], x);.
ad40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad50: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
ad60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ad70: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
ad80: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
ad90: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
ada0: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
adb0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
adc0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
add0: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
ade0: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
adf0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
ae00: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
ae10: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
ae20: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
ae30: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
ae40: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
ae50: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
ae60: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67  data[hdr+5]) + g
ae70: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
ae80: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75  egin+2]);.    pu
ae90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aea0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20  +5], top);.  }. 
aeb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
aec0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
aed0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
aee0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
aef0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
af00: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
af10: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
af20: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
af30: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
af40: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
af50: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
af60: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
af70: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
af80: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
af90: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
afa0: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
afb0: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
afc0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
afd0: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
afe0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
aff0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
b000: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
b010: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
b020: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
b030: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
b040: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b050: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
b060: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
b070: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
b080: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
b090: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
b0a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
b0b0: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
b0c0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b0d0: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
b0e0: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
b0f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
b100: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
b110: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
b120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
b130: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b140: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b150: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
b160: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
b170: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
b180: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
b190: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
b1a0: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
b1b0: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
b1c0: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
b1d0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42  Page->leaf;.  pB
b1e0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
b1f0: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
b200: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
b210: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
b220: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
b230: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
b240: 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65  >hasData = pPage
b250: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
b260: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
b270: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
b280: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
b290: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
b2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
b2b0: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
b2c0: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
b2d0: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
b2e0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
b2f0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
b300: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
b310: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
b320: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b330: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
b340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
b350: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b360: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
b370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b380: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b390: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
b3a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
b3b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
b3c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
b3d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
b3e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
b3f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
b400: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
b410: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
b420: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
b430: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
b440: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
b450: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
b460: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
b470: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
b480: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
b490: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
b4a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
b4b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
b4c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
b4d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
b4e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
b4f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
b500: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
b510: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b520: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b530: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b540: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b550: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b560: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
b570: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
b580: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
b590: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b5a0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
b5b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
b5c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b5d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b5e0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
b5f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
b600: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
b610: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
b620: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
b630: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
b640: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b650: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b660: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b670: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
b680: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
b690: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
b6a0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
b6b0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
b6c0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
b6d0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
b6e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
b6f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
b700: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
b710: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
b720: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
b730: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
b740: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
b750: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
b760: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
b770: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
b780: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
b790: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
b7a0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
b7b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
b7c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
b7d0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
b7e0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
b7f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
b800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b810: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
b820: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b830: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
b840: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
b850: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b860: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b870: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
b880: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b890: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
b8a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b8b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
b8c0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
b8d0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
b8e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b8f0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
b900: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
b910: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
b920: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
b930: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b940: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b950: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
b960: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
b970: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
b980: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61  65536 );.    pPa
b990: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
b9a0: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
b9b0: 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61  ze - 1);.    pPa
b9c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
b9d0: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
b9e0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
b9f0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
ba00: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
ba10: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
ba20: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
ba30: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  af;.    pPage->a
ba40: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
ba50: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
ba60: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
ba70: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
ba80: 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20  set];.    top = 
ba90: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
baa0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
bab0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
bac0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bad0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
bae0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
baf0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
bb00: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
bb10: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
bb20: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
bb30: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
bb40: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
bb50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bb60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
bb70: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
bb80: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
bb90: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
bba0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
bbb0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
bbc0: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
bbd0: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
bbe0: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
bbf0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
bc00: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
bc10: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
bc20: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
bc30: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
bc40: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
bc50: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
bc60: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
bc70: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
bc80: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
bc90: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
bca0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
bcb0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
bcc0: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
bcd0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
bce0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
bcf0: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
bd00: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
bd10: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
bd20: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
bd30: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
bd40: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bd60: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
bd70: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bd80: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
bd90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
bda0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
bdb0: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
bdc0: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
bdd0: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
bde0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
bdf0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
be00: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
be10: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
be20: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
be30: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
be40: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
be50: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
be60: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
be70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
be80: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
be90: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bea0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
beb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bec0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
bed0: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
bee0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
bef0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
bf00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
bf10: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
bf20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bf30: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
bf40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bf50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bf60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bf70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bf80: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bf90: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
bfa0: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
bfb0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
bfc0: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
bfd0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
bfe0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
bff0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
c000: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
c010: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
c020: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
c030: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
c040: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
c050: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
c060: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
c070: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
c080: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
c090: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
c0a0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
c0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c0c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
c0e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0f0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
c100: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c110: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c120: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
c130: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c140: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
c150: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c160: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c170: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
c180: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
c190: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
c1a0: 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d  of..** the free-
c1b0: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
c1c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
c1d0: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
c1e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c1f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c200: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
c210: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
c220: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
c230: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
c240: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
c250: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
c260: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
c270: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
c280: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
c290: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c2a0: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
c2b0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c2c0: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
c2d0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c2e0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
c2f0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c300: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
c310: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
c320: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
c330: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c340: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c350: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c360: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c370: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c380: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c390: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c3a0: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c3b0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c3c0: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c3d0: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c3e0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c3f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c400: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c410: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c420: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c430: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c440: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c450: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c460: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c470: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c480: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c490: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c4a0: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c4b0: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c4c0: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
c4d0: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
c4e0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
c4f0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
c500: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
c510: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c520: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
c530: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
c540: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
c550: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
c560: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c570: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
c580: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c590: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c5a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c5b0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c5c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c5d0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c5e0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c5f0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
c600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c610: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c620: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c630: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
c640: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c650: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c660: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c670: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c680: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c690: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
c6a0: 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
c6b0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  lete ){.    mems
c6c0: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
c6d0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c6e0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
c6f0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
c700: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
c710: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
c720: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
c730: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
c740: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c750: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c760: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c770: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c780: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c790: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c7a0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
c7b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c7c0: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
c7d0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
c7e0: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
c7f0: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
c800: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c810: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
c820: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
c830: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
c840: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
c850: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
c860: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
c870: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
c880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
c890: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c8a0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c8b0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
c8c0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
c8d0: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
c8e0: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
c8f0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
c900: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
c910: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
c920: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
c930: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
c940: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
c950: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
c960: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
c970: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c980: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
c990: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
c9a0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
c9b0: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
c9c0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
c9d0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
c9e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
c9f0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
ca00: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
ca10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
ca20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
ca30: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
ca40: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
ca50: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
ca60: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
ca70: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
ca80: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
ca90: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
caa0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
cab0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
cac0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
cad0: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
cae0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
caf0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
cb00: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
cb10: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
cb20: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
cb30: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
cb40: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
cb50: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
cb60: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
cb70: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
cb80: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
cb90: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
cba0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
cbb0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
cbc0: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
cbd0: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
cbe0: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
cbf0: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
cc00: 20 77 65 20 63 61 6c 6c 20 62 74 72 65 65 4d 61   we call btreeMa
cc10: 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28  kePageWriteable(
cc20: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
cc30: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
cc40: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
cc50: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
cc60: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
cc70: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
cc80: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
cc90: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
cca0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ccb0: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
ccc0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ccd0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
cce0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
ccf0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd00: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
cd10: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
cd20: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
cd30: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
cd40: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
cd50: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
cd60: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
cd70: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
cd80: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
cd90: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
cda0: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
cdb0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
cdc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cdd0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cde0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
cdf0: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
ce00: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
ce10: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
ce20: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
ce30: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
ce40: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
ce50: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
ce60: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
ce70: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
ce80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ce90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
cea0: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
ceb0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
cec0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
ced0: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
cee0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
cef0: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
cf00: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
cf10: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
cf20: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
cf30: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
cf40: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
cf50: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
cf60: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
cf70: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
cf80: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
cf90: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
cfa0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cfb0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
cfc0: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
cfd0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
cfe0: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
cff0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
d000: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
d010: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
d020: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
d030: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
d040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d050: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d060: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d070: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
d080: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
d090: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
d0a0: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
d0b0: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
d0c0: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
d0d0: 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
d0e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
d0f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
d100: 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
d110: 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
d120: 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
d130: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
d140: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
d150: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
d160: 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
d170: 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
d180: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62  .  return (int)b
d190: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
d1a0: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
d1b0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
d1c0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
d1d0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
d1e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
d1f0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
d200: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
d210: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
d220: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
d230: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
d240: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
d250: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d260: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
d270: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
d280: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
d290: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
d2a0: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
d2b0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
d2c0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
d2d0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
d2e0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d2f0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d300: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d310: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d320: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d330: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
d340: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d350: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
d360: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d370: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
d380: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
d390: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
d3a0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
d3b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d3c0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d3d0: 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
d3e0: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
d3f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
d400: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d410: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d420: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
d430: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
d440: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
d450: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d460: 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
d470: 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
d480: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
d490: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d4a0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
d4b0: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
d4c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d4d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
d4e0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d4f0: 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
d500: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
d510: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d520: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
d530: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
d540: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
d550: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
d560: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
d570: 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
d580: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
d590: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
d5a0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
d5b0: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
d5c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
d5d0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d5e0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
d5f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d600: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
d610: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d620: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
d630: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d640: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
d650: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
d660: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
d670: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d680: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d690: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d6a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
d6b0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
d6c0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
d6d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  .  }.}../*.** Du
d6e0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
d6f0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
d700: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
d710: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
d720: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
d730: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
d740: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
d750: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
d760: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
d770: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
d780: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
d790: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
d7a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
d7b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d7c0: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
d7d0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
d7e0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
d7f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
d800: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
d810: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
d820: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d830: 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
d840: 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
d850: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
d860: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
d870: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
d880: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
d890: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d8a0: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d8b0: 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
d8c0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
d8d0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
d8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d8f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d900: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
d910: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
d920: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d930: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d940: 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
d950: 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
d960: 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
d970: 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
d980: 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
d990: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
d9a0: 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
d9b0: 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
d9c0: 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
d9d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
d9e0: 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
d9f0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
da00: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
da10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
da20: 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
da30: 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
da40: 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
da50: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
da60: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
da70: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
da80: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
da90: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
daa0: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
dab0: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
dac0: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
dad0: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
dae0: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
daf0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
db00: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
db10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
db20: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
db30: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
db40: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
db50: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
db60: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
db70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
db80: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
db90: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
dba0: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
dbb0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dbc0: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
dbd0: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
dbe0: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
dbf0: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
dc00: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
dc10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
dc20: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
dc30: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
dc40: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
dc50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dc60: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
dc70: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
dc80: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
dc90: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
dca0: 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
dcb0: 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
dcc0: 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
dcd0: 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
dce0: 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
dcf0: 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
dd00: 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
dd10: 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
dd20: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
dd30: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
dd40: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
dd50: 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
dd60: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
dd70: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
dd80: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
dd90: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
dda0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
ddb0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
ddc0: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
ddd0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
dde0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
ddf0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
de00: 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
de10: 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
de20: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
de30: 69 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  its.** BTREE_OMI
de40: 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
de50: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
de60: 43 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e  CK.  The BTREE_N
de70: 4f 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69  O_READLOCK.** bi
de80: 74 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66  t is also set if
de90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65   the SQLITE_NoRe
dea0: 61 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20  adlock flags is 
deb0: 73 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73  set in db->flags
dec0: 2e 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73  ..** These flags
ded0: 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f   are passed thro
dee0: 75 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ugh into sqlite3
def0: 50 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20  PagerOpen() and 
df00: 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73  must.** be the s
df10: 61 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41  ame values as PA
df20: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
df30: 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45   and PAGER_NO_RE
df40: 41 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ADLOCK..**.** If
df50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
df60: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
df70: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
df80: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
df90: 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
dfa0: 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
dfb0: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
dfc0: 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
dfd0: 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
dfe0: 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
dff0: 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
e000: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
e010: 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
e020: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
e030: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e040: 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
e050: 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
e060: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
e070: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
e080: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
e090: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
e0a0: 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53  Vfs,      /* VFS
e0b0: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
e0c0: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e   b-tree */.  con
e0d0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e0e0: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
e0f0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
e100: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
e110: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
e120: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
e130: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
e140: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
e150: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
e160: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
e170: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
e180: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
e190: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
e1a0: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
e1b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
e1c0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
e1d0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e1e0: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
e1f0: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
e200: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
e210: 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
e220: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
e230: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
e240: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
e250: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
e260: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
e270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e280: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
e290: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e2a0: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
e2b0: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
e2c0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
e2d0: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
e2e0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e2f0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e300: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e310: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
e320: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
e330: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
e340: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e350: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e360: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
e370: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
e380: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
e390: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
e3a0: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
e3b0: 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70  .  /* True if op
e3c0: 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ening an ephemer
e3d0: 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61  al, temporary da
e3e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
e3f0: 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d  t int isTempDb =
e400: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
e410: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30   zFilename[0]==0
e420: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
e430: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
e440: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
e450: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e460: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
e470: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
e480: 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  sed database..  
e490: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
e4a0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e4b0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
e4c0: 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  db = 0;.#else.  
e4d0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e4e0: 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26  b = (zFilename &
e4f0: 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  & strcmp(zFilena
e500: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  me, ":memory:")=
e510: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
e520: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
e530: 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74  sTempDb && sqlit
e540: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
e550: 62 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  b));.#endif..  a
e560: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
e570: 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
e580: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e590: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e5a0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
e5b0: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e5c0: 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
e5d0: 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
e5e0: 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
e5f0: 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
e600: 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
e610: 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
e620: 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
e630: 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
e640: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
e650: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
e660: 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
e670: 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
e680: 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
e690: 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
e6a0: 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
e6b0: 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
e6c0: 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
e6d0: 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
e6e0: 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
e6f0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
e700: 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b  QLITE_NoReadlock
e710: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e720: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
e730: 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  CK;.  }.  if( is
e740: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
e750: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
e760: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
e770: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e780: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
e790: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
e7a0: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
e7b0: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
e7c0: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
e7d0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
e7e0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
e7f0: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
e800: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e810: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
e820: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e840: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
e850: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
e860: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
e870: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
e880: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e890: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
e8a0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
e8b0: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
e8c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
e8d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e8e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e8f0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e900: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e910: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
e920: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
e930: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
e940: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
e950: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
e960: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
e970: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
e980: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
e990: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
e9a0: 3d 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d  =0 && isTempDb==
e9b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  0 ){.    if( vfs
e9c0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e9d0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e9e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e9f0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
ea00: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
ea10: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
ea20: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ea30: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
ea40: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
ea50: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
ea60: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
ea70: 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
ea80: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
ea90: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
eaa0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
eab0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
eac0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
ead0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
eae0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
eaf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
eb00: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
eb10: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
eb20: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
eb30: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eb40: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
eb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
eb60: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
eb70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
eb80: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
eb90: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
eba0: 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
ebb0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
ebc0: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
ebd0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
ebe0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
ebf0: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
ec00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ec10: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
ec20: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
ec30: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
ec40: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
ec50: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
ec60: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
ec70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
ec80: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
ec90: 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
eca0: 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
ecb0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
ecc0: 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
ecd0: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
ece0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ecf0: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
ed00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
ed10: 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
ed20: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
ed30: 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
ed40: 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
ed50: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
ed60: 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
ed70: 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
ed90: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
eda0: 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
edb0: 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
edc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
edd0: 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
ede0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
edf0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
ee00: 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
ee10: 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
ee20: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
ee30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ee40: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
ee50: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
ee60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ee70: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
ee80: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
ee90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
eea0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
eeb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
eec0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
eee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
eef0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
ef00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ef10: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
ef20: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
ef30: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
ef40: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
ef50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ef60: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ef70: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
ef80: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
ef90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
efa0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
efb0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
efc0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
efd0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
efe0: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
eff0: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
f000: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
f010: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
f020: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
f030: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
f040: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
f050: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
f060: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
f070: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
f080: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
f090: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
f0a0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
f0b0: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
f0c0: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
f0d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
f0e0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
f0f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
f100: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
f110: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
f120: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
f130: 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
f140: 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
f150: 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
f160: 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
f170: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
f180: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
f190: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
f1a0: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
f1b0: 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
f1c0: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
f1d0: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
f1e0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
f1f0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f200: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
f210: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
f220: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f230: 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
f240: 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
f250: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f260: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
f270: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f280: 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
f290: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
f2a0: 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
f2b0: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
f2c0: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
f2d0: 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
f2e0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
f2f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f300: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
f310: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f320: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
f330: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
f340: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
f350: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
f380: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
f390: 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
f3a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f3b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f3c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
f3d0: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
f3e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
f3f0: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
f400: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
f410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f420: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f430: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f440: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
f450: 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
f460: 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
f470: 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
f480: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
f490: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
f4a0: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
f4b0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
f4c0: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
f4d0: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
f4e0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
f4f0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
f500: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
f510: 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74  readOnly = sqlit
f520: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
f530: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  y(pBt->pPager);.
f540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
f550: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
f560: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
f570: 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 1;.#endif.  
f580: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f590: 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
f5a0: 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
f5b0: 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
f5c0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
f5d0: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
f5e0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
f5f0: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
f600: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
f610: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
f620: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
f630: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f640: 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
f650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f660: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
f670: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
f680: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
f690: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
f6a0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f6b0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
f6c0: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
f6d0: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
f6e0: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
f6f0: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
f700: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
f710: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
f720: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
f730: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
f740: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
f750: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
f760: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
f770: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
f780: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
f790: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
f7a0: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
f7b0: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
f7c0: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
f7d0: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
f7e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
f7f0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
f800: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
f810: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
f820: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
f830: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
f840: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
f850: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
f860: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
f870: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
f880: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
f890: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
f8a0: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
f8b0: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
f8c0: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
f8d0: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
f8e0: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
f8f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f900: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f910: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
f920: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
f930: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
f940: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
f950: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
f960: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
f970: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
f980: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
f990: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
f9a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
f9b0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
f9c0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
f9d0: 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
f9e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
f9f0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
fa00: 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
fa10: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
fa20: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
fa30: 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
fa40: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
fa50: 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
fa60: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
fa70: 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
fa80: 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
fa90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
faa0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
fab0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
fac0: 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
fad0: 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
fae0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
faf0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
fb00: 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
fb10: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
fb20: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
fb30: 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
fb40: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
fb50: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
fb60: 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ).      pBt->nRe
fb70: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54  f = 1;.      MUT
fb80: 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
fb90: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
fba0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
fbb0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
fbc0: 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
fbd0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
fbe0: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
fbf0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
fc00: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
fc10: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
fc20: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
fc30: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
fc40: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
fc50: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
fc60: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
fc70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fc80: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
fc90: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
fca0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
fcb0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
fcc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fcd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fce0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
fcf0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
fd00: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
fd10: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fd20: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
fd30: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
fd40: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fd50: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
fd60: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
fd70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fd80: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
fd90: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
fda0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
fdb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
fdc0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
fdd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fde0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
fdf0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
fe00: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
fe10: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
fe20: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
fe30: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
fe40: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
fe50: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
fe60: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
fe70: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
fe80: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
fe90: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fea0: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
feb0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
fec0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
fed0: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
fee0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
fef0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
ff00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
ff10: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
ff20: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
ff30: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
ff40: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
ff50: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
ff60: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
ff70: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
ff80: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
ff90: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
ffa0: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
ffb0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
ffc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
ffd0: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
ffe0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fff0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
10000 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
10010 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
10020 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
10030 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
10040 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
10050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10060 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
10070 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
10080 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
10090 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
100a0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
100b0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
100c0 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
100d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
100e0 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
100f0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
10100 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10120 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
10130 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
10140 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
10150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10160 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
10170 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
10180 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
10190 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
101a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
101b0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
101c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
101d0 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
101e0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
101f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
10200 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
10210 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
10220 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
10230 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
10240 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
10250 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
10260 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
10270 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
10280 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
10290 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
102a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
102b0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
102c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
102d0 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
102e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
102f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
10300 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
10310 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
10320 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
10330 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
10340 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
10350 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10360 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
10370 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
10380 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10390 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
103a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
103b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
103c0 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
103d0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
103e0 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
103f0 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
10400 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
10410 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
10420 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
10430 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
10440 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
10450 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
10460 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
10470 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
10480 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
10490 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
104a0 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
104b0 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
104c0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
104d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
104e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
104f0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
10500 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
10510 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
10520 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
10530 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
10540 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10550 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
10560 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
10570 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
10580 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10590 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
105a0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
105b0 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
105c0 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
105d0 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
105e0 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
105f0 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
10600 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
10610 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
10620 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
10630 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
10640 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10650 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10660 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
10670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10680 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
10690 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
106a0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
106b0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
106c0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
106d0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
106e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
106f0 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
10700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10710 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
10720 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
10730 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
10740 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
10750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
10760 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
10770 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
10780 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
10790 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
107a0 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
107b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
107c0 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
107d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
107e0 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
107f0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
10800 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
10810 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10820 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
10830 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
10840 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
10850 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
10860 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
10870 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
10880 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
10890 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
108a0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
108b0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
108c0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
108d0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d  ageSize );.  }.}
108e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
108f0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10900 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
10910 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
10920 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
10930 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
10940 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e  3PageFree( pBt->
10950 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42  pTmpSpace);.  pB
10960 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
10970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10980 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
10990 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
109a0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
109b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
109c0 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
109d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
109e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
109f0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
10a00 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
10a10 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
10a20 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
10a30 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
10a40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10a50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
10a60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10a70 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
10a80 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
10a90 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
10aa0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
10ab0 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
10ac0 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
10ad0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
10ae0 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
10af0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10b00 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
10b10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10b20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
10b30 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
10b40 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
10b50 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
10b60 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
10b70 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
10b80 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
10b90 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
10ba0 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
10bb0 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
10bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
10bd0 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
10be0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10bf0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
10c00 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
10c10 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
10c20 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
10c30 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
10c40 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
10c50 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
10c60 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
10c70 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
10c80 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
10c90 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
10ca0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
10cb0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
10cc0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
10cd0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
10ce0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
10cf0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
10d00 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
10d10 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
10d20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
10d30 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
10d40 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
10d50 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
10d60 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
10d70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
10d80 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
10d90 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
10da0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
10db0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
10dc0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
10dd0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
10de0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10df0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
10e00 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
10e10 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
10e20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10e30 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
10e40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10e50 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
10e60 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
10e70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10e80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10e90 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
10ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10eb0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10ec0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10ed0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10ee0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10ef0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
10f00 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
10f10 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
10f20 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
10f30 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
10f40 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
10f50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
10f60 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
10f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10f90 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
10fa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10fb0 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10fc0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10fd0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10fe0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10ff0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
11000 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
11010 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
11020 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
11030 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
11040 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
11050 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
11060 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
11070 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
11080 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
11090 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
110a0 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
110b0 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
110c0 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
110d0 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
110e0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
110f0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
11100 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
11110 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
11120 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
11130 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
11140 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11150 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
11160 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
11170 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
11180 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
11190 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
111a0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
111b0 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
111c0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
111d0 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
111e0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
111f0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
11200 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
11210 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
11220 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
11230 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
11240 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11250 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
11260 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11270 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11280 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
112a0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
112b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
112c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
112d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
112e0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
112f0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
11300 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11310 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11330 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11340 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11350 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11360 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11370 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11380 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11390 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
113a0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
113b0 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
113c0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
113d0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
113e0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
113f0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
11400 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
11410 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11420 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11430 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11440 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11450 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11460 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11470 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11480 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11490 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
114a0 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
114b0 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
114c0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
114d0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
114e0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
114f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11500 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11510 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
11520 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
11530 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11550 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11560 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11570 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65  on */.  int leve
11580 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11590 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
115a0 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
115b0 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
115c0 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  /.  int fullSync
115d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ,          /* PR
115e0 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20  AGMA fullfsync. 
115f0 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c  */.  int ckptFul
11600 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50  lSync       /* P
11610 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
11620 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a  _fullfync */.){.
11630 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11640 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11650 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11660 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
11670 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11680 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
11690 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69  vel<=3 );.  sqli
116a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
116b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
116c0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
116d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
116e0 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70  l, fullSync, ckp
116f0 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  tFullSync);.  sq
11700 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11710 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11720 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11730 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11740 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11750 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11760 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11770 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11780 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11790 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
117a0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
117b0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
117c0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
117d0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
117e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
117f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11800 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11810 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11820 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11830 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11840 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11850 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11860 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11880 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11890 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
118a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
118b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
118c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
118d0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
118e0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
118f0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
11900 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
11910 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
11920 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
11930 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
11940 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11950 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
11960 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
11970 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
11980 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
11990 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
119a0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
119b0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
119c0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
119d0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
119e0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
119f0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
11a00 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
11a10 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
11a20 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
11a30 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
11a40 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
11a50 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
11a60 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
11a70 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
11a80 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
11a90 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
11aa0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
11ab0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
11ac0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
11ad0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
11ae0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
11af0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
11b00 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
11b10 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
11b20 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
11b30 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
11b40 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
11b50 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
11b60 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
11b70 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
11b80 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
11b90 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78   the pageSizeFix
11ba0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ed flag is set s
11bb0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
11bc0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
11bd0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
11be0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
11bf0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
11c00 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
11c10 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
11c20 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
11c30 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
11c40 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
11c50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
11c60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11c70 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
11c80 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
11c90 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
11ca0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11cb0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
11cc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11cd0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
11ce0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11cf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11d00 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
11d10 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
11d20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
11d30 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11d40 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
11d50 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
11d60 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
11d70 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
11d80 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
11d90 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
11da0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
11db0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
11dc0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
11dd0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
11de0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
11df0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
11e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
11e10 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
11e20 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
11e30 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
11e40 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
11e50 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
11e60 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
11e70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11e80 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11e90 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11ea0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
11eb0 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
11ec0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
11ed0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
11ee0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
11ef0 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  x ) pBt->pageSiz
11f00 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71  eFixed = 1;.  sq
11f10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11f20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11f40 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
11f50 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
11f60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11f70 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
11f80 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
11f90 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
11fa0 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  Size;.}..#if !de
11fb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11fc0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
11fd0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
11fe0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
11ff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12000 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
12010 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
12020 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
12030 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
12040 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
12050 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
12060 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
12070 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
12080 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
12090 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
120a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
120b0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
120c0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
120d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
120e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
120f0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
12100 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
12110 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
12120 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12130 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12140 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
12150 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
12160 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
12170 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
12180 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
12190 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
121a0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
121b0 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
121c0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
121d0 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
121e0 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
121f0 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
12200 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12210 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
12220 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
12230 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
12240 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12250 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
12260 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
12270 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
12280 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
12290 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
122a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
122b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
122c0 65 20 73 65 63 75 72 65 44 65 6c 65 74 65 20 66  e secureDelete f
122d0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
122e0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
122f0 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
12300 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
12310 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
12320 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
12330 66 20 74 68 65 20 73 65 63 75 72 65 44 65 6c 65  f the secureDele
12340 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  te.** setting af
12350 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
12360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12370 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
12380 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
12390 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
123a0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
123b0 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
123c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
123d0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
123e0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
123f0 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 28  secureDelete = (
12400 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20 31 20  newFlag!=0) ? 1 
12410 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  : 0;.  } .  b = 
12420 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  p->pBt->secureDe
12430 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  lete;.  sqlite3B
12440 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12450 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64  return b;.}.#end
12460 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
12470 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
12480 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
12490 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
124a0 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
124b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
124c0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
124d0 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
124e0 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
124f0 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
12500 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
12510 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
12520 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
12530 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
12540 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
12550 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
12560 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
12570 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
12580 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
12590 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
125a0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
125b0 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
125c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
125d0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
125e0 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
125f0 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
12600 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12610 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
12620 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12630 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
12640 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12650 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12660 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
12670 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
12680 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12690 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
126a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
126b0 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  d && (av ?1:0)!=
126c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
126d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
126e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
126f0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
12700 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
12710 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
12720 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
12730 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
12740 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12750 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12760 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12770 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
12780 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
12790 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
127a0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
127b0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
127c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
127d0 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
127e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
127f0 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
12800 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
12810 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12820 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
12830 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
12840 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
12850 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
12860 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
12870 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
12880 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
12890 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
128a0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
128b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
128c0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
128d0 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
128e0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
128f0 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
12900 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12910 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12920 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
12930 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
12940 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
12950 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
12960 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
12970 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
12980 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
12990 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
129a0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
129b0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
129c0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
129d0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
129e0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
129f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
12a00 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
12a10 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
12a20 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
12a30 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
12a40 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
12a50 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
12a60 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
12a70 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
12a80 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
12a90 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
12aa0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
12ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12ac0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
12ad0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
12ae0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
12af0 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
12b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12b10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
12b20 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
12b30 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
12b40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12b50 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
12b60 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
12b70 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
12b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12b90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12ba0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
12bb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12bc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
12bd0 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
12be0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
12bf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12c00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12c10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12c20 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
12c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
12c40 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
12c50 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
12c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
12c70 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
12c80 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
12c90 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
12ca0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12cb0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12cc0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
12cd0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
12ce0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
12cf0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
12d00 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
12d10 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
12d20 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
12d30 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
12d40 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
12d50 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
12d60 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
12d70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
12d80 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
12d90 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
12da0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
12db0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12dc0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
12dd0 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
12de0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
12df0 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
12e00 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
12e10 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
12e20 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
12e30 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
12e40 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
12e50 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
12e60 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
12e70 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
12e80 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
12e90 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
12ea0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12eb0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
12ec0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12ed0 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
12ee0 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
12ef0 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
12f00 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
12f10 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
12f20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12f30 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12f40 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
12f50 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
12f60 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
12f70 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
12f80 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
12f90 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
12fa0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12fb0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
12fc0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
12fd0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
12fe0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
12ff0 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
13000 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
13010 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
13020 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
13030 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
13040 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
13050 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
13060 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
13070 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
13080 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
13090 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
130a0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
130b0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
130c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
130d0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
130e0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
130f0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
13100 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
13110 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
13120 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
13130 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
13140 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
13150 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
13160 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
13170 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
13180 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
13190 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d 3e 64  19]==2 && pBt->d
131a0 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20 29 7b  oNotUseWAL==0 ){
131b0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
131c0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
131d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
131e0 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
131f0 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
13200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13220 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13230 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
13240 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
13250 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
13260 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13270 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13290 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
132a0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
132b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
132c0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
132d0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
132e0 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
132f0 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
13300 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
13310 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
13320 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
13330 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
13340 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
13350 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
13360 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
13370 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
13380 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
13390 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
133a0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
133b0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
133c0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
133d0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
133e0 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
133f0 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
13400 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
13410 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13420 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
13430 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
13440 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
13450 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
13460 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
13470 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
13480 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
13490 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
134a0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
134b0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
134c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
134d0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
134e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
134f0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
13500 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
13510 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
13520 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
13530 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
13540 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
13550 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
13560 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
13570 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
13580 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
13590 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
135a0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
135b0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
135c0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
135d0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
135e0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
135f0 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
13600 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
13610 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
13620 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
13630 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
13640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13650 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
13660 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
13670 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
13680 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
13690 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
136a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
136b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
136c0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
136d0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
136e0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
136f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13700 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
13710 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
13720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13730 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
13740 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
13750 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
13760 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
13790 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
137a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
137b0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
137c0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
137d0 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
137e0 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
137f0 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
13800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
13810 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
13820 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13830 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13840 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
13850 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
13860 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13870 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
13880 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
13890 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
138a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
138b0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
138c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
138d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
138e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
138f0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
13900 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
13910 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
13920 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
13930 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
13940 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
13950 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
13960 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
13970 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
13980 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
13990 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
139a0 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
139b0 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
139c0 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
139d0 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
139e0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
139f0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
13a00 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
13a10 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
13a20 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
13a30 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
13a40 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
13a50 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
13a60 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
13a70 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
13a80 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
13a90 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
13aa0 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
13ab0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
13ac0 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
13ad0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
13ae0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
13af0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
13b00 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
13b10 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
13b20 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
13b30 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
13b40 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
13b50 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
13b60 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
13b70 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
13b80 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
13b90 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
13ba0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
13bb0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
13bc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
13bd0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
13be0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
13bf0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
13c00 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
13c10 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
13c20 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
13c30 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
13c40 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
13c50 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
13c60 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
13c70 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
13c80 33 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  3);.  assert( pB
13c90 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
13ca0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
13cb0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
13cc0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
13cd0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
13ce0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
13cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
13d00 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
13d10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
13d20 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
13d30 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
13d40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
13d50 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
13d60 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
13d70 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
13d80 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
13d90 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
13da0 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
13db0 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
13dc0 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
13dd0 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
13de0 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
13df0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
13e00 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
13e10 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
13e20 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
13e30 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
13e40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
13e50 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
13e60 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
13e70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13e80 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13e90 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
13ea0 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
13eb0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
13ec0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13ed0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13ee0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13ef0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
13f00 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
13f10 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
13f20 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
13f30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
13f40 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
13f50 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
13f60 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13f70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
13f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
13f90 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
13fa0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
13fb0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
13fc0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
13fd0 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ata );.    relea
13fe0 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
13ff0 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  e1);.    pBt->pP
14000 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  age1 = 0;.  }.}.
14010 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
14020 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
14030 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
14040 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
14050 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
14060 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
14070 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
14080 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14090 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
140a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
140b0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
140c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
140d0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
140e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
140f0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
14100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
14120 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
14130 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
14140 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14150 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
14160 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
14170 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
14180 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
14190 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c  MakePageWriteabl
141a0 65 28 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63  e(pP1);.  if( rc
141b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
141c0 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
141d0 61 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  a;.  memcpy(data
141e0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
141f0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
14200 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
14210 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
14220 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
14230 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
14240 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
14250 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
14260 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
14270 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
14280 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
14290 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
142a0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
142b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
142c0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
142d0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
142e0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
142f0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
14300 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
14310 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
14320 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
14330 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
14340 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
14350 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
14360 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
14370 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
14380 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
14390 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
143a0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
143b0 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
143c0 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
143d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
143e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
143f0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
14400 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
14410 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
14420 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
14430 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
14440 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14450 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
14460 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
14470 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
14480 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
14490 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
144a0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
144b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
144c0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
144d0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
144e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
144f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
14500 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
14510 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
14520 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
14530 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
14540 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
14550 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
14560 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
14570 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
14580 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
14590 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
145a0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
145b0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
145c0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
145d0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
145e0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
145f0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
14600 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
14610 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
14620 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
14630 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
14640 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
14650 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
14660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
14670 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
14680 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
14690 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
146a0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
146b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
146c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
146d0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
146e0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
146f0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
14700 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
14710 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
14720 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
14730 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
14740 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
14750 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
14760 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
14770 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14780 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
14790 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
147a0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
147b0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
147c0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
147d0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
147e0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
147f0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14800 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
14810 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14820 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
14830 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
14840 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
14850 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
14860 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
14870 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
14880 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
14890 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
148a0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
148b0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
148c0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
148d0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
148e0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
148f0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
14900 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
14910 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
14920 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
14930 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
14940 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
14950 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
14960 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
14970 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
14980 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
14990 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
149a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
149b0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
149c0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
149d0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
149e0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
149f0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
14a00 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
14a10 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
14a20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
14a30 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
14a40 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
14a50 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
14a60 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
14a70 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
14a80 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
14a90 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
14aa0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
14ab0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
14ac0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
14ad0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
14ae0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
14af0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
14b00 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
14b10 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
14b20 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
14b30 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
14b40 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
14b50 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
14b60 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
14b70 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
14b80 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
14b90 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
14ba0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
14bb0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
14bc0 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
14bd0 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
14be0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14bf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14c00 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
14c10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
14c20 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
14c30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
14c40 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
14c50 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
14c60 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
14c70 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
14c80 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
14c90 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
14ca0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
14cb0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
14cc0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
14cd0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
14ce0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
14cf0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
14d00 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
14d10 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
14d20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14d30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
14d40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
14d50 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
14d60 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
14d70 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
14d80 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
14d90 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
14da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
14db0 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
14dc0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
14dd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14de0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14df0 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  E.  /* If anothe
14e00 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
14e10 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
14e20 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
14e30 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
14e40 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
14e50 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
14e60 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
14e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
14e80 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
14e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
14ea0 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  CKED..  */.  if(
14eb0 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
14ec0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
14ed0 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
14ee0 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29  pBt->isPending )
14ef0 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
14f00 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
14f10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
14f20 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
14f30 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
14f40 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
14f50 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
14f60 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
14f70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
14f80 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
14f90 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
14fa0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
14fb0 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
14fc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
14fd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
14fe0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
14ff0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
15000 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
15010 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
15020 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
15030 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
15040 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
15050 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
15060 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
15070 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
15080 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
15090 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
150a0 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
150b0 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
150c0 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
150d0 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
150e0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
150f0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
15100 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
15110 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
15120 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
15130 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
15140 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
15150 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
15160 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
15170 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
15180 6e 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69  n;..  pBt->initi
15190 61 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29  allyEmpty = (u8)
151a0 28 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b  (pBt->nPage==0);
151b0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
151c0 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
151d0 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
151e0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
151f0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
15200 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
15210 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
15220 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
15230 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
15240 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
15250 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
15260 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
15270 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
15280 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
15290 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
152a0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
152b0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
152c0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
152d0 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
152e0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
152f0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
15300 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
15310 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
15320 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
15330 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
15340 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
15350 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
15360 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
15370 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
15380 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
15390 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
153a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
153b0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
153c0 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
153d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
153e0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
153f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15400 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15410 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
15420 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
15430 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
15440 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
15450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15470 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
15480 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
15490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
154a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
154b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
154c0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
154d0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
154e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
154f0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
15500 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
15510 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
15520 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
15530 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
15540 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
15550 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
15560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15570 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
15580 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
15590 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
155a0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
155b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
155c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
155d0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
155e0 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70  le ){..assert( p
155f0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
15600 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
15610 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
15620 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
15630 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
15640 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
15650 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
15660 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
15670 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
15680 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
15690 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
156a0 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
156b0 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
156c0 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
156d0 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
156e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
156f0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
15700 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
15710 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
15720 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
15730 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
15740 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
15750 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
15760 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15770 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
15780 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
15790 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
157a0 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
157b0 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
157c0 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
157d0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  1);.#endif..    
157e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
157f0 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
15800 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
15810 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
15820 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
15830 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
15840 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
15850 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
15860 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
15870 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
15880 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
15890 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
158a0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
158b0 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
158c0 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
158d0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
158e0 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
158f0 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
15900 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
15910 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
15920 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
15930 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
15940 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
15950 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
15960 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
15970 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
15980 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61  rc = btreeMakePa
15990 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 61 67  geWriteable(pPag
159a0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e1);.        if(
159b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
159c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
159d0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
159e0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
159f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
15a00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15a10 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
15a20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15a30 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
15a40 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
15a50 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
15a60 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
15a70 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
15a80 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
15a90 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
15aa0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
15ab0 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
15ac0 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
15ad0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
15ae0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
15af0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
15b00 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
15b10 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
15b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15b30 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
15b40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
15b50 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
15b60 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
15b70 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
15b80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15ba0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15bb0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15bc0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
15bd0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
15be0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
15bf0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
15c00 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
15c10 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
15c20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
15c30 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
15c40 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
15c50 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
15c60 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
15c70 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
15c80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
15c90 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
15ca0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
15cb0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
15ce0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
15cf0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15d20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
15d30 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15d60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
15d70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15d80 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
15d90 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
15da0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
15db0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
15dc0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
15dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15de0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
15df0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
15e00 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
15e10 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
15e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15e30 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
15e40 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
15e50 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
15e60 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
15e70 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
15e80 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
15e90 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
15ea0 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
15eb0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
15ec0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
15ed0 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
15ee0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
15ef0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
15f00 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
15f10 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
15f20 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
15f30 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
15f40 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
15f50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
15f60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15f70 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
15f80 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
15f90 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
15fa0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
15fb0 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
15fc0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
15fd0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
15fe0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
15ff0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
16000 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
16010 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
16020 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
16030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
16040 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
16050 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
16060 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
16070 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
16080 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
16090 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
160a0 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
160b0 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
160c0 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
160d0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
160e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
160f0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
16100 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
16110 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
16120 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
16130 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
16150 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
16160 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
16170 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
16180 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
16190 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
161a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
161d0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
161e0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
161f0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
16200 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
16210 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
16220 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
16230 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
16240 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
16250 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
16260 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
16270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16280 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
16290 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
162a0 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
162b0 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
162c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
162d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
162e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
162f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
16300 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
16310 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
16320 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
16330 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
16340 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
16350 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
16360 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
16370 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
16380 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
16390 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
163a0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
163b0 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
163c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
163d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
163e0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
163f0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
16400 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
16410 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
16420 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
16430 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
16440 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
16450 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50  ..    btreeInitP
16460 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
16470 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
16480 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
16490 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
164a0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
164b0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
164c0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
164d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
164e0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
164f0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
16500 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72  nfo;.        btr
16510 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
16520 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
16530 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
16540 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a   info.iOverflow.
16550 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c           && pCel
16560 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
16570 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +3<=pPage->aData
16580 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
16590 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46 72  .         && iFr
165a0 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
165b0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
165c0 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ow]).        ){.
165d0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
165e0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
165f0 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
16600 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16630 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
16640 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
16650 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
16660 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
16670 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16690 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
166a0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
166b0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
166c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
166d0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
166e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
166f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
16700 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
16710 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16720 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16730 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
16740 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
16750 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
16760 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
16770 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
16780 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
16790 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
167a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
167b0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
167c0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
167d0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
167e0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
167f0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
16800 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
16810 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
16820 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
16830 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
16840 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
16850 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
16860 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
16870 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
16880 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
16890 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
168a0 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
168b0 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
168c0 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
168d0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
168e0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
168f0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
16900 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
16910 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
16920 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
16930 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
16940 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
16950 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
16960 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
16970 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
16980 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
16990 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
169a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
169b0 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
169c0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
169d0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
169e0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
169f0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
16a00 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
16a10 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
16a20 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
16a30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
16a40 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
16a50 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
16a60 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
16a70 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
16a80 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
16a90 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
16aa0 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
16ab0 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
16ac0 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
16ad0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
16ae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
16af0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
16b00 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
16b10 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
16b20 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
16b30 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
16b40 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
16b50 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
16b60 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
16b70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
16b80 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
16b90 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
16ba0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
16bb0 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
16bc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16bd0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
16be0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
16bf0 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
16c00 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
16c10 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
16c20 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
16c30 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
16c40 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
16c50 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
16c60 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
16c70 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
16c80 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
16c90 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
16ca0 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
16cb0 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
16cc0 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
16cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
16ce0 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
16cf0 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
16d00 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
16d10 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
16d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16d40 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
16d50 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
16d60 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
16d70 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
16d80 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
16d90 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
16da0 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
16db0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
16dc0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
16dd0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
16de0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
16df0 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
16e00 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
16e10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
16e20 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
16e30 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
16e40 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16e50 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
16e60 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
16e70 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
16e80 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
16e90 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
16ea0 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
16eb0 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
16ec0 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
16ed0 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
16ee0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
16ef0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
16f00 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
16f10 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
16f20 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
16f30 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
16f40 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
16f50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16f60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
16f70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
16f90 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
16fa0 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
16fb0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
16fc0 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
16fd0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
16fe0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
16ff0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
17000 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
17010 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17050 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
17060 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
17070 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
17080 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
17090 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
170a0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
170b0 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
170c0 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
170d0 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
170e0 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
170f0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
17100 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
17110 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
17120 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
17130 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
17140 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
17150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17160 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17170 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
17180 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69  btreeMakePageWri
17190 74 65 61 62 6c 65 28 70 50 74 72 50 61 67 65 29  teable(pPtrPage)
171a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
171b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
171c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
171d0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
171e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
171f0 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
17200 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
17210 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
17220 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
17230 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17240 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
17250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17260 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
17270 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
17280 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
17290 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
172a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
172b0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
172c0 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
172d0 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
172e0 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
172f0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
17300 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
17310 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
17320 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
17330 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
17340 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
17350 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
17360 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
17370 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
17380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
17390 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
173a0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
173b0 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
173c0 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
173d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
173e0 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
173f0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
17400 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
17410 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17420 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
17430 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
17440 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
17450 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
17460 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
17470 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
17480 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
17490 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
174a0 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
174b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
174c0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
174d0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
174e0 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
174f0 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
17500 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
17510 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
17520 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
17530 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
17540 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
17550 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
17560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
17570 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
17580 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
17590 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20  ss is complete. 
175a0 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
175b0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
175c0 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63 75  that.** incrVacu
175d0 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62 65  umStep() will be
175e0 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74 65   called a finite
175f0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73   amount of times
17600 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f 72  .** which may or
17610 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20 74   may not empty t
17620 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41 20  he freelist.  A 
17630 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d 0a  full autovacuum.
17640 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20 20  ** has nFin>0.  
17650 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65 6d  A "PRAGMA increm
17660 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68 61  ental_vacuum" ha
17670 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74  s nFin==0..*/.st
17680 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
17690 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
176a0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
176b0 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b  , Pgno iLastPg){
176c0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
176d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
176e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
176f0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
17700 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
17710 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
17720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17730 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
17740 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
17750 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
17760 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
17770 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
17780 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
17790 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
177a0 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
177b0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
177c0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
177d0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
177e0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
177f0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
17800 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
17810 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
17820 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
17830 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
17840 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
17850 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
17860 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
17870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
178a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
178b0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
178c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
178d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
178e0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
178f0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
17900 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  E ){.      if( n
17910 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Fin==0 ){.      
17920 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17930 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
17940 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
17950 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
17960 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
17970 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65  f nFin is non-ze
17980 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
17990 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
179a0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
179b0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
179c0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
179d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
179e0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
179f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
17a00 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
17a10 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
17a20 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
17a30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17a40 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
17a50 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
17a60 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
17a70 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
17a80 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
17a90 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
17aa0 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20   iLastPg, 1);.  
17ab0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17ad0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17af0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
17b00 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
17b10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17b20 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
17b30 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
17b40 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
17b50 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
17b60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
17b70 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
17b80 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
17b90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
17ba0 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  tPg;..      rc =
17bb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
17bc0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
17bd0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
17be0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17bf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
17c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17c10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
17c20 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
17c30 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
17c40 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
17c50 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
17c60 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
17c70 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
17c80 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
17c90 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
17ca0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17cb0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
17cc0 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
17cd0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
17ce0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
17cf0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
17d00 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
17d10 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
17d20 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
17d30 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
17d40 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
17d50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17d60 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
17d70 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
17d80 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
17d90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
17da0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
17db0 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
17dc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17de0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17df0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
17e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17e20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17e30 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
17e40 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
17e50 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
17e60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e70 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
17e80 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
17e90 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61  rc = btreeMakePa
17ea0 67 65 57 72 69 74 65 61 62 6c 65 28 70 4c 61 73  geWriteable(pLas
17eb0 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
17ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17ed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
17ee0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
17ef0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
17f00 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
17f10 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
17f20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
17f30 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
17f40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17f80 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20  ..  if( nFin==0 
17f90 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  ){.    iLastPg--
17fa0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61  ;.    while( iLa
17fb0 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
17fc0 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
17fd0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17fe0 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
17ff0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
18000 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
18010 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  g) ){.        Me
18020 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20  mPage *pPg;.    
18030 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18040 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
18050 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
18060 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18080 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
180a0 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65    rc = btreeMake
180b0 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50  PageWriteable(pP
180c0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  g);.        rele
180d0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
180e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
180f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18100 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18120 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  }.      iLastPg-
18130 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
18140 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
18150 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
18160 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
18170 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
18180 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
18190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
181a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
181b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
181c0 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
181d0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
181e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
181f0 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
18200 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
18210 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
18220 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
18230 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
18240 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
18250 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
18260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
18270 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
18280 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
18290 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
182a0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
182b0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
182c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
182d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
182e0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
182f0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
18300 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
18310 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
18320 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
18330 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18340 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
18350 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
18370 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
18380 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
18390 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
183a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
183b0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
183c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
183d0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
183e0 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
183f0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
18400 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
18410 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
18420 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67  pBt, 0, btreePag
18430 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20  ecount(pBt));.  
18440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
18460 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
18470 72 69 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 50  riteable(pBt->pP
18480 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 75 74  age1);.      put
18490 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
184a0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
184b0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
184c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
184d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
184e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
184f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18500 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
18510 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
18520 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
18530 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
18540 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
18550 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
18560 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
18570 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18580 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
18590 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
185a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
185b0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
185c0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
185d0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
185e0 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
185f0 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
18600 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
18610 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
18620 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
18630 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
18640 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
18650 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
18660 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
18670 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
18680 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
18690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
186a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
186b0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
186c0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
186d0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
186e0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
186f0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
18700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18710 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
18720 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
18730 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
18740 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
18750 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
18760 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
18770 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
18780 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
18790 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
187a0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
187b0 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
187c0 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
187d0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
187e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
187f0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
18800 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
18810 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
18820 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18830 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
18840 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
18850 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
18860 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
18870 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
18880 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74   */.    int nEnt
18890 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ry;        /* Nu
188a0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
188b0 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
188c0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
188d0 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
188e0 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
188f0 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
18900 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
18910 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
18920 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
18930 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
18940 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
18950 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18960 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
18970 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18980 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
18990 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
189a0 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
189b0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
189c0 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
189d0 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
189e0 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
189f0 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
18a00 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
18a10 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
18a20 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
18a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
18a40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18a50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
18a60 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
18a70 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
18a80 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
18a90 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
18aa0 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
18ab0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
18ac0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
18ad0 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
18ae0 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
18af0 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  y;.    nFin = nO
18b00 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
18b10 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e  trmap;.    if( n
18b20 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
18b30 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
18b40 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
18b50 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
18b60 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
18b70 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  }.    while( PTR
18b80 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18b90 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
18ba0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
18bb0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
18bc0 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
18bd0 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
18be0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18bf0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
18c00 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
18c10 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
18c20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
18c30 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
18c40 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
18c50 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
18c60 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iFree);.    }.  
18c70 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
18c80 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
18c90 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
18ca0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
18cb0 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
18cc0 72 69 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 50  riteable(pBt->pP
18cd0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 75 74  age1);.      put
18ce0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18cf0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
18d00 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
18d10 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
18d20 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
18d30 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
18d40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
18d50 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
18d60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18d70 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
18d80 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  t->pPager, nFin)
18d90 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
18da0 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
18db0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18dd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
18de0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
18df0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
18e00 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
18e10 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
18e20 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
18e30 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
18e40 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
18e50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
18e60 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
18e70 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
18e80 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
18e90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18ea0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
18eb0 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
18ec0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
18ed0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
18ee0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
18ef0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
18f00 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
18f10 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
18f20 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
18f30 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
18f40 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
18f50 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
18f60 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
18f70 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18f80 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
18f90 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
18fa0 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
18fb0 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
18fc0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
18fd0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18fe0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
18ff0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
19000 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
19010 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
19020 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
19030 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
19040 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
19050 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
19060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19070 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
19080 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
19090 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
190a0 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
190b0 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
190c0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
190d0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
190e0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
190f0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
19100 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
19110 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
19120 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
19130 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
19140 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
19150 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
19160 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
19170 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
19180 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
19190 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
191a0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
191b0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
191c0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
191d0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
191e0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
191f0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
19200 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
19210 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
19220 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19230 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
19240 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
19250 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
19260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
19270 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
19280 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
19290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
192a0 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
192b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
192c0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
192d0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
192e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
192f0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
19300 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
19310 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
19320 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
19330 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
19340 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
19350 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
19360 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
19370 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
19380 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
19390 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
193a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
193b0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
193c0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
193d0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
193e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
193f0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
19400 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
19410 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
19420 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19430 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
19440 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
19450 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
19460 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19470 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
19480 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
19490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
194a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
194b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
194c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
194d0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
194e0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
194f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
19510 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19520 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
19530 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19540 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
19550 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19560 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
19570 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
19580 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
19590 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
195a0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
195b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
195c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
195d0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
195e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
195f0 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
19600 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
19610 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
19620 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
19630 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19640 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
19650 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
19660 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19670 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
19680 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
19690 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
196a0 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
196b0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
196c0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
196d0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e  RANS_NONE && p->
196e0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
196f0 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  t>1 ){.    /* If
19700 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
19710 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
19720 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
19730 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
19740 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
19750 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
19760 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
19770 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
19780 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
19790 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
197a0 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
197b0 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
197c0 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
197d0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
197e0 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
197f0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
19800 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
19810 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
19820 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
19830 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
19840 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
19850 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
19860 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
19870 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
19880 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
19890 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
198a0 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
198b0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
198c0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
198d0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
198e0 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
198f0 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
19900 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
19910 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
19920 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
19930 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
19940 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
19950 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
19960 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
19970 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
19980 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
19990 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
199a0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
199b0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
199c0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
199d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
199e0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
199f0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
19a00 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
19a10 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
19a20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
19a30 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
19a40 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
19a50 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
19a60 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
19a70 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
19a80 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
19a90 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
19aa0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
19ab0 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
19ac0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
19ad0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
19ae0 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
19af0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
19b00 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
19b10 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
19b20 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
19b30 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
19b40 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
19b50 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
19b60 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
19b70 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
19b80 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
19b90 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
19ba0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
19bb0 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
19bc0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
19bd0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
19be0 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
19bf0 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
19c00 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
19c10 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
19c20 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
19c30 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
19c40 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
19c50 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
19c60 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
19c70 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
19c80 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
19c90 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
19ca0 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
19cb0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
19cc0 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
19cd0 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
19ce0 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
19cf0 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
19d00 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
19d10 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
19d20 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
19d30 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
19d40 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
19d50 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
19d60 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
19d70 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
19d80 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
19d90 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
19da0 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
19db0 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
19dc0 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
19dd0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19de0 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
19df0 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
19e00 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
19e10 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
19e20 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
19e30 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
19e40 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
19e50 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
19e60 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
19e70 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
19e80 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
19e90 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
19ea0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
19eb0 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
19ec0 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
19ed0 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
19ee0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
19ef0 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
19f00 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
19f10 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
19f20 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
19f30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
19f40 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
19f50 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
19f60 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
19f70 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
19f80 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
19f90 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
19fa0 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
19fb0 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
19fc0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
19fd0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
19fe0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19ff0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1a000 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1a010 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1a020 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1a030 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1a040 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1a050 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1a060 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1a070 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1a080 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a090 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1a0a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1a0b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a0c0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1a0d0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1a0e0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1a0f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1a100 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1a110 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1a120 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1a130 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1a140 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1a150 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1a160 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a170 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1a180 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1a190 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a1a0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1a1b0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1a1c0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1a1d0 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1a1e0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1a1f0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1a200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a210 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1a220 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1a230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a240 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1a250 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1a260 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
1a290 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1a2a0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
1a2b0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1a2c0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1a2d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a2e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
1a2f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1a300 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
1a310 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
1a320 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a330 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
1a340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1a350 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a360 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
1a370 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1a380 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
1a390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a3a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a3b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1a3c0 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
1a3d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1a3e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1a3f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1a400 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
1a410 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1a420 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
1a430 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
1a440 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
1a450 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
1a460 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
1a470 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
1a480 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
1a490 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
1a4a0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  efined..**.** Fo
1a4b0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1a4c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
1a4d0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
1a4e0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
1a4f0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
1a500 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  of writing to th
1a510 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74  e databse.  That
1a520 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f   means the curso
1a530 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61  r was.** origina
1a540 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  lly opened for w
1a550 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63  riting and the c
1a560 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65  ursor has not be
1a570 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20   disabled.** by 
1a580 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65  having its state
1a590 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53   changed to CURS
1a5a0 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61  OR_FAULT..*/.sta
1a5b0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
1a5c0 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
1a5d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
1a5e0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
1a5f0 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
1a600 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
1a610 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
1a620 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
1a630 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
1a640 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
1a650 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
1a660 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
1a670 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
1a680 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a690 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
1a6a0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
1a6b0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
1a6c0 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
1a6d0 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
1a6e0 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
1a6f0 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
1a700 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
1a710 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
1a720 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1a730 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
1a740 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
1a750 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1a760 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1a770 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
1a780 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
1a790 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1a7a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a7b0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1a7c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1a7d0 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
1a7e0 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
1a7f0 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
1a800 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
1a810 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
1a820 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
1a830 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
1a840 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
1a850 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1a860 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
1a870 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
1a880 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
1a890 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
1a8a0 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
1a8b0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1a8c0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
1a8d0 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
1a8e0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
1a8f0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1a900 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1a910 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
1a920 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
1a930 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71  tCursor *p;.  sq
1a940 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a950 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
1a960 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
1a970 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a980 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
1a990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1a9a0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
1a9b0 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
1a9c0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
1a9d0 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
1a9e0 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
1a9f0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1aa00 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1aa10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
1aa20 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1aa30 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
1aa40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1aa50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1aa60 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
1aa70 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
1aa80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1aa90 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
1aaa0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
1aab0 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
1aac0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
1aad0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
1aae0 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
1aaf0 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
1ab00 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1ab10 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
1ab20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
1ab30 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
1ab40 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1ab50 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1ab60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ab70 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1ab80 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1ab90 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1aba0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1abb0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1abc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1abd0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
1abe0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1abf0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ac00 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
1ac10 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
1ac20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ac30 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  p);.  rc = saveA
1ac40 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1ac50 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
1ac60 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1ac70 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
1ac80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ac90 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
1aca0 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
1acb0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
1acc0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
1acd0 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
1ace0 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
1acf0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1ad00 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
1ad10 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
1ad20 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
1ad30 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
1ad40 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
1ad50 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
1ad60 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
1ad70 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
1ad80 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
1ad90 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
1ada0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
1adb0 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
1adc0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
1add0 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
1ade0 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
1adf0 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
1ae00 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
1ae10 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
1ae20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
1ae30 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
1ae40 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
1ae50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1ae60 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1ae70 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20  ursors(p, rc);. 
1ae80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
1ae90 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1aea0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1aeb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1aec0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
1aed0 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
1aee0 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
1aef0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1af00 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
1af10 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
1af20 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1af30 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1af40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1af50 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
1af60 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
1af70 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
1af80 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
1af90 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
1afa0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
1afb0 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
1afc0 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
1afd0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
1afe0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
1aff0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
1b000 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
1b010 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1b020 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
1b030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1b040 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
1b050 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
1b060 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1b070 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
1b080 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
1b090 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
1b0a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1b0b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b0c0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
1b0d0 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
1b0e0 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
1b0f0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1b100 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
1b110 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1b120 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1b130 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
1b140 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
1b150 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1b160 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1b170 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
1b180 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1b190 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1b1a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b1b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b1c0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
1b1d0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
1b1e0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1b1f0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e  nsaction can can
1b200 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
1b210 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
1b220 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
1b230 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
1b240 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
1b250 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
1b260 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
1b270 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1b280 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1b290 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
1b2a0 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
1b2b0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1b2c0 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
1b2d0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
1b2e0 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
1b2f0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
1b300 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
1b310 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
1b320 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
1b330 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
1b340 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
1b350 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
1b360 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
1b370 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
1b380 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
1b390 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
1b3a0 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
1b3b0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
1b3c0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
1b3d0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
1b3e0 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
1b3f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1b400 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
1b410 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
1b420 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
1b430 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1b440 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
1b450 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
1b460 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1b470 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
1b480 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
1b490 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
1b4a0 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
1b4b0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
1b4c0 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
1b4d0 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
1b4e0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1b4f0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
1b500 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
1b510 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
1b520 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
1b530 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
1b540 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1b550 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
1b560 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
1b570 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
1b580 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
1b590 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
1b5a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b5b0 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
1b5c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
1b5d0 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
1b5e0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1b5f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1b600 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b610 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1b620 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b630 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1b640 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e  ert( pBt->readOn
1b650 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
1b660 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1b670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1b680 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1b690 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1b6a0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1b6b0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1b6c0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1b6d0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1b6e0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1b6f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1b700 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1b710 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1b720 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1b730 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1b740 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1b750 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1b760 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1b770 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1b780 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1b790 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1b7a0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1b7b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1b7c0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1b7d0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1b7e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1b7f0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1b800 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1b810 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1b820 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b830 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1b850 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b860 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1b870 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1b880 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1b890 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1b8a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1b8b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1b8c0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1b8d0 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1b8e0 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1b8f0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1b900 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1b910 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1b920 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1b930 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1b940 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1b950 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1b960 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1b970 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1b980 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1b990 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1b9a0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1b9b0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1b9c0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1b9d0 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1b9e0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1b9f0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1ba00 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1ba10 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1ba20 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1ba30 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1ba40 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1ba50 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1ba60 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1ba70 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1ba80 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1ba90 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1baa0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1bab0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1bac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1bad0 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1bae0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1baf0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1bb00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1bb10 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1bb20 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1bb30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1bb40 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1bb50 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1bb60 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1bb70 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1bb80 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1bb90 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1bba0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bbb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1bbc0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1bbd0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1bbe0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1bbf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bc00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1bc10 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1bc20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c  && pBt->initiall
1bc30 79 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e 50  yEmpty ) pBt->nP
1bc40 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
1bc50 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1bc60 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
1bc70 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
1bc80 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
1bc90 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
1bca0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1bcb0 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
1bcc0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
1bcd0 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
1bce0 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
1bcf0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1bd00 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
1bd10 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1bd20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
1bd30 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
1bd40 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
1bd50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
1bd60 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
1bd70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1bd80 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1bd90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bda0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1bdb0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
1bdc0 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
1bdd0 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
1bde0 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
1bdf0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
1be00 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
1be10 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1be20 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
1be30 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
1be40 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
1be50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1be60 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
1be70 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
1be80 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
1be90 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
1bea0 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
1beb0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
1bec0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
1bed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1bee0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
1bef0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1bf00 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
1bf10 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
1bf20 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
1bf30 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1bf40 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
1bf50 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
1bf60 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
1bf70 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
1bf80 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
1bf90 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
1bfa0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
1bfb0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
1bfc0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
1bfd0 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
1bfe0 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
1bff0 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
1c000 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
1c010 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
1c020 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
1c030 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
1c040 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1c050 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
1c060 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
1c070 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
1c080 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
1c090 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
1c0a0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
1c0b0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
1c0c0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
1c0d0 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
1c0e0 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
1c0f0 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
1c100 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
1c110 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
1c120 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
1c130 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
1c140 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
1c150 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
1c160 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1c170 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
1c180 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
1c190 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
1c1a0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
1c1b0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
1c1c0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
1c1d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1c1e0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
1c1f0 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
1c200 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
1c210 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
1c220 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
1c230 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
1c240 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
1c250 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
1c260 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
1c270 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1c280 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
1c290 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
1c2a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1c2b0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
1c2c0 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
1c2d0 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
1c2e0 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
1c2f0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1c300 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1c310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1c320 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1c330 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1c360 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1c370 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c390 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1c3a0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1c3b0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1c3e0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1c3f0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1c400 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1c410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c420 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
1c430 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1c440 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
1c450 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c470 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
1c480 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
1c490 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c4a0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1c4b0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1c4c0 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
1c4d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1c4e0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1c4f0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
1c500 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1c510 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20  wrFlag==1 );..  
1c520 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c530 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
1c540 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
1c550 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
1c560 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
1c570 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1c580 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
1c590 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
1c5a0 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
1c5b0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
1c5c0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1c5d0 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
1c5e0 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
1c5f0 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
1c600 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
1c610 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1c620 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1c630 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
1c640 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67  yInfo!=0, wrFlag
1c650 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
1c660 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
1c670 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1c680 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
1c690 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1c6a0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
1c6b0 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
1c6c0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
1c6d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1c6e0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1c6f0 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
1c700 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
1c710 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1c720 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1c730 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
1c740 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1c750 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ata );..  if( NE
1c760 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70 42  VER(wrFlag && pB
1c770 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
1c780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c790 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
1c7a0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
1c7b0 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
1c7c0 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
1c7d0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1c7e0 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
1c7f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1c800 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
1c810 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
1c820 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
1c830 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
1c840 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
1c850 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
1c860 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
1c870 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
1c880 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
1c890 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
1c8a0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
1c8b0 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
1c8c0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1c8d0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
1c8e0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
1c8f0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
1c900 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29  r->wrFlag = (u8)
1c910 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1c920 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1c930 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1c940 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1c950 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1c960 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1c970 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1c980 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1c990 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1c9a0 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61  ALID;.  pCur->ca
1c9b0 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20  chedRowid = 0;. 
1c9c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c9d0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1c9e0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
1c9f0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ca20 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1ca30 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1ca60 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1ca70 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1ca80 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1cab0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1cac0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1cad0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1cae0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1caf0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1cb00 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
1cb10 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1cb20 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
1cb50 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
1cb60 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1cb70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1cb80 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
1cb90 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
1cba0 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
1cbb0 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
1cbc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1cbd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cbe0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1cbf0 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
1cc00 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
1cc10 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
1cc20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
1cc30 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
1cc40 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
1cc50 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
1cc60 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
1cc70 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
1cc80 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
1cc90 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
1cca0 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
1ccb0 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
1ccc0 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
1ccd0 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
1cce0 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
1ccf0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1cd00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cd10 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
1cd20 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
1cd30 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
1cd40 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
1cd50 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
1cd60 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
1cd70 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
1cd80 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
1cd90 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
1cda0 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
1cdb0 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
1cdc0 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
1cdd0 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
1cde0 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
1cdf0 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
1ce00 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
1ce10 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
1ce20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
1ce30 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
1ce40 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
1ce50 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
1ce60 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
1ce70 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
1ce80 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
1ce90 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
1cea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1ceb0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
1cec0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
1ced0 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
1cee0 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
1cef0 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ge));.}../*.** S
1cf00 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  et the cached ro
1cf10 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65  wid value of eve
1cf20 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65  ry cursor in the
1cf30 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1cf40 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61  ile.** as pCur a
1cf50 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61  nd having the sa
1cf60 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  me root page num
1cf70 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68  ber as pCur.  Th
1cf80 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  e value is.** se
1cf90 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a  t to iRowid..**.
1cfa0 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65  ** Only positive
1cfb0 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72   rowid values ar
1cfc0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c  e considered val
1cfd0 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68  id for this cach
1cfe0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20  e..** The cache 
1cff0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1d000 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69  o zero, indicati
1d010 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61  ng an invalid ca
1d020 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20  che..** A btree 
1d030 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77  will work fine w
1d040 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  ith zero or nega
1d050 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65  tive rowids.  We
1d060 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20   just cannot.** 
1d070 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65  cache zero or ne
1d080 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77  gative rowids, w
1d090 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65  hich means table
1d0a0 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20  s that use zero 
1d0b0 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72  or.** negative r
1d0c0 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20  owids might run 
1d0d0 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
1d0e0 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63    But in practic
1d0f0 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65  e, zero.** or ne
1d100 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72  gative rowids ar
1d110 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20  e very uncommon 
1d120 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  so this should n
1d130 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
1d140 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d150 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
1d160 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
1d170 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ur, sqlite3_int6
1d180 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43  4 iRowid){.  BtC
1d190 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
1d1a0 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75  p=pCur->pBt->pCu
1d1b0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1d1c0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1d1d0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d  >pgnoRoot==pCur-
1d1e0 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63  >pgnoRoot ) p->c
1d1f0 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f  achedRowid = iRo
1d200 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  wid;.  }.  asser
1d210 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  t( pCur->cachedR
1d220 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a  owid==iRowid );.
1d230 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d240 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1d250 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
1d260 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69  ursor.  A negati
1d270 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65  ve or zero.** re
1d280 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1d290 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f  ates that the ro
1d2a0 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76  wid cache is inv
1d2b0 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
1d2c0 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  be.** ignored.  
1d2d0 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  If the rowid cac
1d2e0 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  he has never bef
1d2f0 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68  ore been set, th
1d300 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20  en a.** zero is 
1d310 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  returned..*/.sql
1d320 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1d330 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
1d340 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1d350 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1d360 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1d370 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
1d380 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1d390 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1d3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d3b0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1d3c0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1d3d0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1d3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d3f0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1d400 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1d410 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1d420 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1d430 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1d440 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1d450 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1d460 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1d470 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1d480 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1d490 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1d4a0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1d4b0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1d4c0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1d4d0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1d4e0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1d4f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1d500 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1d510 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1d520 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1d530 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1d540 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1d550 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1d560 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1d570 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1d580 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1d590 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1d5a0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1d5b0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1d5c0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1d5d0 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
1d5e0 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
1d5f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
1d600 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
1d610 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1d620 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1d630 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d640 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1d650 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1d660 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1d670 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1d680 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1d690 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1d6a0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1d6b0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1d6c0 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
1d6d0 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
1d6e0 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
1d6f0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
1d700 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
1d710 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1d720 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
1d730 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
1d740 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
1d750 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
1d760 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
1d770 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1d780 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1d790 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1d7a0 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1d7b0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1d7c0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1d7d0 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1d7e0 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1d7f0 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1d800 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1d810 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1d820 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1d830 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1d840 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1d850 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1d860 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1d870 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1d880 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1d890 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1d8a0 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1d8b0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1d8c0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1d8d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1d8e0 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1d8f0 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1d900 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1d910 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1d920 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1d930 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1d940 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1d950 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1d960 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1d970 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1d980 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1d990 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1d9a0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1d9b0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1d9c0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1d9d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1d9e0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1d9f0 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
1da00 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
1da10 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
1da20 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
1da30 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
1da40 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
1da50 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
1da60 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
1da70 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
1da80 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
1da90 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
1daa0 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
1dab0 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
1dac0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1dad0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
1dae0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1daf0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
1db00 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1db10 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74  >iPage;.      bt
1db20 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1db30 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1db40 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1db50 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1db60 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1db70 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1db80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1db90 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1dba0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1dbb0 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1dbc0 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1dbd0 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1dbe0 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1dbf0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1dc00 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1dc10 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1dc20 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1dc70 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1dc80 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1dcc0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1dcd0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65        \.    btre
1dd10 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1dd20 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1dd30 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1dd40 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1dd50 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1dd60 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1de00 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1de50 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1de60 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1de70 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1de80 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1de90 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1dea0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1deb0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1dec0 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1ded0 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1dee0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1def0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1df00 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1df10 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1df20 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1df30 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1df40 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1df50 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1df60 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1df70 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1df80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1df90 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1dfa0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1dfb0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1dfc0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
1dfd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
1dfe0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
1dff0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1e000 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1e010 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1e020 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1e030 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1e040 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1e050 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1e060 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1e070 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1e080 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1e090 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1e0a0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1e0b0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1e0c0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1e0d0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1e0e0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1e0f0 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1e100 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e110 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1e120 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1e130 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
1e140 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
1e150 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1e160 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
1e170 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1e180 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
1e190 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1e1a0 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
1e1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1e1c0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1e1d0 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1e1e0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1e1f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e200 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e210 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e220 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1e230 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e240 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e250 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1e260 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
1e270 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
1e280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
1e290 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1e2a0 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
1e2b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1e2c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e2d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e2e0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1e2f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e300 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
1e310 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
1e320 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
1e330 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
1e340 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1e350 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1e360 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
1e370 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
1e380 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
1e390 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
1e3a0 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
1e3b0 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
1e3c0 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
1e3d0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
1e3e0 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
1e3f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
1e400 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
1e410 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
1e420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
1e430 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1e440 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
1e450 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
1e460 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
1e470 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
1e480 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
1e490 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
1e4a0 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
1e4b0 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
1e4c0 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
1e4d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1e4e0 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
1e4f0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
1e500 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1e510 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e520 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1e530 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1e540 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1e550 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1e560 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
1e570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
1e580 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  a;.  return SQLI
1e590 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e5a0 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
1e5b0 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
1e5c0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e5d0 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
1e5e0 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
1e5f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
1e600 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
1e610 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
1e620 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
1e630 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
1e640 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
1e650 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
1e660 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
1e670 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
1e680 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
1e690 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
1e6a0 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
1e6b0 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
1e6c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1e6d0 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
1e6e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1e6f0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1e700 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
1e710 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1e720 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
1e730 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
1e740 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
1e750 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
1e760 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
1e770 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
1e780 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
1e790 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
1e7a0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
1e7b0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
1e7c0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
1e7d0 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
1e7e0 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
1e7f0 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
1e800 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
1e810 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
1e820 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
1e830 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
1e840 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1e850 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
1e860 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1e870 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1e880 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
1e890 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
1e8a0 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
1e8b0 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
1e8c0 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
1e8d0 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
1e8e0 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1e8f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
1e900 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
1e910 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
1e920 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
1e930 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
1e940 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
1e950 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
1e960 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
1e970 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1e980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1e990 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1e9a0 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e9c0 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
1e9d0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1e9e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
1e9f0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1ea00 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
1ea10 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
1ea20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
1ea30 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
1ea40 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1ea50 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
1ea60 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
1ea70 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
1ea80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1ea90 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
1eaa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1eab0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1eac0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1ead0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1eae0 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1eaf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eb00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1eb10 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1eb20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1eb30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1eb40 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1eb50 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1eb60 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1eb70 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1eb80 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1eb90 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1eba0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1ebb0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1ebc0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1ebd0 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1ebe0 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1ebf0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1ec00 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1ec10 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1ec20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1ec30 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1ec40 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1ec50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1ec60 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1ec70 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1ec80 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1ec90 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1eca0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1ecb0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1ecc0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1ecd0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ece0 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1ecf0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1ed00 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
1ed10 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1ed20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1ed30 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1ed40 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1ed50 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1ed60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1ed70 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1ed80 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1ed90 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1eda0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1edb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1edc0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1edd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1ede0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
1edf0 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
1ee00 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
1ee10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ee20 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1ee30 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1ee40 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
1ee50 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1ee60 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1ee70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
1ee80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ee90 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
1eea0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1eeb0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1eec0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
1eed0 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
1eee0 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
1eef0 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
1ef00 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
1ef10 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
1ef20 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1ef30 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
1ef40 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
1ef50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ef60 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1ef70 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1ef80 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1ef90 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1efa0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1efb0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1efc0 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1efd0 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1efe0 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1eff0 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1f000 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1f010 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1f020 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1f030 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1f040 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1f050 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1f060 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1f070 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1f080 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1f090 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1f0a0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1f0b0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1f0c0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1f0d0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1f0e0 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1f0f0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1f100 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1f110 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1f120 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1f130 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1f140 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1f150 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1f160 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1f170 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1f180 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1f190 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1f1a0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1f1b0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1f1c0 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1f1d0 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1f1e0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1f1f0 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1f200 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f210 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1f220 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1f230 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1f240 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1f250 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1f260 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1f270 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1f280 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1f290 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1f2a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f2b0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1f2c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1f2d0 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1f2e0 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1f2f0 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1f300 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1f310 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1f320 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1f330 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1f340 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1f350 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1f360 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1f370 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1f380 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1f390 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1f3a0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1f3b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1f3c0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1f3d0 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1f3e0 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1f3f0 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1f400 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1f410 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1f420 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1f430 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1f440 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1f450 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1f460 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1f470 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1f480 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1f490 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1f4a0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1f4b0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1f4c0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1f4d0 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1f4e0 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1f4f0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1f500 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1f510 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f520 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1f530 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1f540 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1f550 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1f560 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1f570 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1f580 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1f590 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f5a0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1f5b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f5c0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1f5d0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1f5e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1f5f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f600 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1f610 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1f620 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1f630 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f640 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1f650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1f660 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1f670 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1f680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1f690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f6a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f6b0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1f6c0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1f6d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1f6e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1f6f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f700 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f710 0a 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ...  getCellInfo
1f720 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
1f730 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
1f740 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
1f750 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b  fo.nHeader;.  nK
1f760 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74  ey = (pPage->int
1f770 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70  Key ? 0 : (int)p
1f780 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
1f790 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66  ..  if( NEVER(of
1f7a0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
1f7b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1f7c0 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f  ) .   || &aPaylo
1f7d0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
1f7e0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
1f7f0 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
1f800 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20  eSize].  ){.    
1f810 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
1f820 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
1f830 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
1f840 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
1f850 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1f860 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f870 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
1f880 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
1f890 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
1f8a0 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
1f8b0 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
1f8c0 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1f8d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f8e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
1f8f0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
1f900 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
1f910 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
1f920 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
1f930 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
1f940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
1f950 4f 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Op ){.      if( 
1f960 28 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50  (rc = btreeMakeP
1f970 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 61  ageWriteable(pPa
1f980 67 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ge))!=SQLITE_OK 
1f990 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f9a0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1f9b0 43 75 72 29 3b 0a 20 20 20 20 20 20 61 50 61 79  Cur);.      aPay
1f9c0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1f9d0 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
1f9e0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1f9f0 20 20 20 20 6d 65 6d 63 70 79 28 61 50 61 79 6c      memcpy(aPayl
1fa00 6f 61 64 2b 6f 66 66 73 65 74 2c 20 70 42 75 66  oad+offset, pBuf
1fa10 2c 20 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , a);.    }else{
1fa20 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1fa30 75 66 2c 20 61 50 61 79 6c 6f 61 64 2b 6f 66 66  uf, aPayload+off
1fa40 73 65 74 2c 20 61 29 3b 0a 20 20 20 20 7d 0a 20  set, a);.    }. 
1fa50 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1fa60 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1fa70 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1fa80 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1fa90 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1faa0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1fab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fac0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1fad0 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
1fae0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1faf0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1fb00 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1fb10 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1fb20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1fb30 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1fb40 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1fb50 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1fb60 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1fb70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1fb80 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1fb90 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1fba0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1fbb0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1fbc0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1fbd0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1fbe0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1fbf0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1fc00 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1fc10 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1fc20 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1fc30 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1fc40 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1fc50 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1fc60 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1fc70 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1fc80 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1fc90 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1fca0 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1fcb0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1fcc0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1fcd0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1fce0 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1fcf0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1fd00 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1fd10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1fd20 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1fd30 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1fd40 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1fd50 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1fd60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1fd70 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1fd80 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1fd90 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1fda0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1fdb0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1fdc0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
1fdd0 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
1fde0 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c  ;.      /* nOvfl
1fdf0 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74   is always posit
1fe00 69 76 65 2e 20 20 49 66 20 69 74 20 77 65 72 65  ive.  If it were
1fe10 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c   zero, fetchPayl
1fe20 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20  oad would have. 
1fe30 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65       ** been use
1fe40 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69  d instead of thi
1fe50 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  s routine. */.  
1fe60 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e      if( ALWAYS(n
1fe70 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e  Ovfl) && !pCur->
1fe80 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1fe90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fea0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1feb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1fec0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1fed0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
1fee0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1fef0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
1ff00 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1ff10 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
1ff20 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
1ff30 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
1ff40 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
1ff50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ff60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1ff70 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1ff80 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
1ff90 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
1ffa0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
1ffb0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
1ffc0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1ffd0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
1ffe0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
1fff0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
20000 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
20010 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
20020 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
20030 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
20040 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
20050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
20060 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
20070 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
20080 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
20090 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
200a0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
200b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
200c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
200d0 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
200e0 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
200f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
20100 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
20110 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
20120 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
20130 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
20140 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
20150 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
20160 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
20170 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
20180 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
20190 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
201a0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
201b0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
201c0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
201d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
201e0 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
201f0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
20200 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
20210 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
20220 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
20230 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
20240 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
20250 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
20260 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
20270 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
20280 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
20290 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
202a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
202b0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
202c0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
202d0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
202e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
202f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
20300 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
20310 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
20320 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
20330 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
20340 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
20350 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
20360 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
20370 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
20380 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
20390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
203a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
203b0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
203c0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
203d0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
203e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
203f0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
20400 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
20410 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
20420 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
20430 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
20440 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
20450 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
20460 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
20470 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
20480 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
20490 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
204a0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
204b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
204c0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
204d0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
204e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
204f0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
20500 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
20510 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
20520 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
20530 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20540 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
20550 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
20560 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
20570 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
20580 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
20590 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
205a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
205b0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
205c0 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
205d0 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
205e0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
205f0 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
20600 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
20610 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
20620 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
20630 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
20640 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
20650 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
20660 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
20670 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
20680 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
20690 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
206a0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
206b0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
206c0 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
206d0 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
206e0 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
206f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
20700 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
20710 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
20720 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
20730 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
20740 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
20750 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20780 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
20790 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
207d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
207e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
207f0 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
20820 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
20830 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
20840 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
20850 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20  hods     /* (3) 
20860 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
20870 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20880 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20  a[19]==0x01     
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208a0 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
208b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
208c0 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
208d0 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
208e0 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
208f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
20900 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
20910 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
20920 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
20930 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
20940 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  , pBt->pageSize 
20950 2a 20 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  * (nextPage-1));
20960 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
20970 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
20980 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
20990 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
209a0 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
209b0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
209c0 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
209d0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
209e0 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
209f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20a00 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
20a10 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
20a20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20a30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20a50 20 20 20 69 66 28 20 65 4f 70 20 26 26 20 28 72     if( eOp && (r
20a60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20a70 57 72 69 74 65 28 70 44 62 50 61 67 65 29 29 21  Write(pDbPage))!
20a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20a90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20aa0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
20ab0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20ae0 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
20af0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
20b00 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
20b10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
20b20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
20b30 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
20b40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
20b50 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Op ){.          
20b60 20 20 20 20 6d 65 6d 63 70 79 28 26 61 50 61 79      memcpy(&aPay
20b70 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
20b80 70 42 75 66 2c 20 61 29 3b 0a 20 20 20 20 20 20  pBuf, a);.      
20b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20ba0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
20bb0 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61  y(pBuf, &aPayloa
20bc0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b  d[offset+4], a);
20bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20be0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20bf0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
20c00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
20c10 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
20c20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
20c40 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
20c50 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
20c60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
20c70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20c80 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
20c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20ca0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
20cb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20cc0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
20cd0 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
20ce0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
20cf0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
20d00 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
20d10 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
20d20 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
20d30 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
20d40 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
20d50 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
20d60 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
20d70 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
20d80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
20d90 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
20da0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
20db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20dc0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
20dd0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
20de0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
20df0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
20e00 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
20e10 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
20e20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
20e30 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
20e40 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
20e50 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
20e60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
20e70 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
20e80 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
20e90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
20ea0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20ec0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20ed0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
20ee0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
20ef0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
20f00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20f20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20f30 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
20f40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20f50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
20f60 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
20f70 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
20f80 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
20f90 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
20fa0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
20fb0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
20fc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
20fd0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
20fe0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
20ff0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
21000 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
21010 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
21020 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
21030 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
21040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21050 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
21060 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
21070 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
21080 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
21090 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
210a0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
210b0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
210c0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
210d0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
210e0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
210f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
21100 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
21110 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
21120 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
21130 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
21140 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
21150 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21160 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
21170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21180 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
21190 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
211a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
211b0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
211c0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
211d0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
211e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
211f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
21200 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21210 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
21220 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
21230 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
21240 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21250 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
21260 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21270 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
21280 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21290 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
212a0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
212b0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
212c0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
212d0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
212e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
212f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
21300 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
21310 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
21320 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
21330 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
21340 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
21350 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
21360 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
21370 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
21380 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
21390 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
213a0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
213b0 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
213c0 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
213d0 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
213e0 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
213f0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
21400 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
21410 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
21420 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
21430 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
21440 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
21450 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21460 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
21470 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
21480 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
21490 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
214a0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
214b0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
214c0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
214d0 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
214e0 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
214f0 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
21500 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
21510 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
21520 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
21530 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
21540 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
21550 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
21560 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
21570 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
21580 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
21590 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
215a0 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
215b0 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
215c0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
215d0 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
215e0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
215f0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
21600 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
21610 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
21620 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
21630 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
21640 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
21650 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
21660 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
21670 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
21680 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
21690 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
216a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
216b0 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
216c0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
216d0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
216e0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
216f0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
21700 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
21710 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
21720 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
21730 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
21740 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
21750 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
21760 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
21770 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
21780 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
21790 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
217a0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
217b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
217c0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32   u32 nKey;.  u32
217d0 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
217e0 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
217f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
21800 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21810 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
21820 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21830 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21840 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
21850 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21860 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
21870 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21880 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
21890 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
218a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
218b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
218c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
218d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
218e0 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  ) ){.    btreePa
218f0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
21900 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21910 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ], pCur->aiIdx[p
21920 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
21950 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  }.  aPayload = p
21960 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b  Cur->info.pCell;
21970 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70  .  aPayload += p
21980 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
21990 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  r;.  if( pPage->
219a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b  intKey ){.    nK
219b0 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
219c0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74  .    nKey = (int
219d0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
219e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
219f0 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
21a00 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
21a10 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
21a20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
21a30 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
21a40 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
21a50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
21a60 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c   assert( nLocal<
21a70 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a  =nKey );.  }.  *
21a80 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
21a90 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
21aa0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
21ab0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
21ac0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
21ad0 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
21ae0 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
21af0 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
21b00 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
21b10 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
21b20 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
21b30 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
21b40 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
21b50 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
21b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
21b70 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
21b80 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
21b90 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
21ba0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
21bb0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
21bc0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
21bd0 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
21be0 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
21bf0 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
21c00 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
21c10 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
21c20 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
21c30 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
21c40 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
21c50 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
21c60 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
21c70 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
21c80 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
21c90 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
21ca0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
21cb0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
21cc0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
21cd0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
21ce0 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
21cf0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
21d00 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
21d10 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21d20 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  Amt){.  const vo
21d30 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73  id *p = 0;.  ass
21d40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21d50 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21d60 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
21d80 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21d90 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  Cur) );.  if( AL
21da0 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
21db0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
21dc0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e   ){.    p = (con
21dd0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
21de0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
21df0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
21e00 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn p;.}.const vo
21e10 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
21e20 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
21e30 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21e40 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  Amt){.  const vo
21e50 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73  id *p = 0;.  ass
21e60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21e70 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21e80 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
21ea0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21eb0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  Cur) );.  if( AL
21ec0 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
21ed0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
21ee0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e   ){.    p = (con
21ef0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
21f00 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
21f10 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
21f20 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
21f30 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
21f40 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
21f50 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
21f60 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
21f70 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
21f80 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
21f90 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
21fa0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
21fb0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
21fc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
21fd0 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
21fe0 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
21ff0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
22000 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
22010 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
22020 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
22030 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
22040 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
22050 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
22060 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
22070 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
22080 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
22090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
220a0 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
220b0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
220c0 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
220d0 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75  c;.  int i = pCu
220e0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50  r->iPage;.  MemP
220f0 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
22100 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22110 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
22120 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22130 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22140 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22150 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22160 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
22170 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
22180 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
22190 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  H );.  if( pCur-
221a0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
221b0 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
221c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
221d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
221e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
221f0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
22200 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
22210 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
22220 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
22230 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
22240 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
22250 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
22260 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
22270 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
22280 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22290 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
222a0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
222b0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  age->nCell<1 || 
222c0 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79  pNewPage->intKey
222d0 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  !=pCur->apPage[i
222e0 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
222f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22300 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22310 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22320 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
22330 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
22340 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
22350 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
22360 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
22370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
22380 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
22390 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
223a0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
223b0 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
223c0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
223d0 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
223e0 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
223f0 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
22400 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
22410 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
22420 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
22430 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
22440 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
22450 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
22460 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
22470 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
22480 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
22490 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
224a0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
224b0 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
224c0 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
224d0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
224e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
224f0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
22500 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
22510 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
22520 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
22530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
22540 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
22550 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
22560 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
22570 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
22580 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
22590 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
225a0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
225b0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
225c0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
225d0 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
225e0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
225f0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
22600 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
22610 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
22620 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
22630 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
22640 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
22650 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
22660 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
22670 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
22680 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
22690 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
226a0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
226b0 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
226c0 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
226d0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
226e0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
226f0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22700 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22710 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22720 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
22730 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
22740 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22750 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22760 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
22770 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
22780 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22790 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
227a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
227b0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
227c0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
227d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
227e0 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73  no.  );.  releas
227f0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
22800 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
22810 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
22820 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  -;.  pCur->info.
22830 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22840 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
22850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
22860 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
22870 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
22880 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
22890 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
228a0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
228b0 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
228c0 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
228d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
228e0 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
228f0 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
22900 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
22910 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
22920 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
22930 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
22940 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
22950 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
22960 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
22970 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
22980 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
22990 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
229a0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
229b0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
229c0 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
229d0 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
229e0 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
229f0 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
22a00 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
22a10 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
22a20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
22a30 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
22a40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
22a50 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
22a60 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
22a70 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
22a80 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
22a90 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
22aa0 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
22ab0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
22ac0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
22ad0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
22ae0 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
22af0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
22b00 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
22b10 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
22b20 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
22b30 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
22b40 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
22b50 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
22b60 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
22b70 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
22b80 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
22b90 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
22ba0 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
22bb0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
22bc0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
22bd0 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
22be0 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
22bf0 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
22c00 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
22c10 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
22c20 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
22c30 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
22c40 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
22c50 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
22c60 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
22c70 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
22c80 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
22c90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
22ca0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
22cb0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
22cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
22cd0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
22ce0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
22cf0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
22d00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22d10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
22d30 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
22d40 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
22d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
22d60 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
22d70 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
22d80 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
22d90 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
22da0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
22db0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
22dc0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
22dd0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
22de0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
22df0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
22e00 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
22e10 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
22e20 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
22e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
22e40 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
22e50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
22e60 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
22e70 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
22e80 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
22e90 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
22ea0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
22eb0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
22ec0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
22ed0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
22ee0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
22ef0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
22f00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
22f10 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
22f20 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
22f30 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
22f40 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
22f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
22f60 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
22f70 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
22f80 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
22f90 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
22fa0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
22fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22fc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
22fd0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22fe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
22ff0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
23000 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
23010 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
23020 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
23030 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
23040 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
23050 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
23060 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
23070 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
23080 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
23090 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
230a0 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
230b0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
230c0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
230d0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
230e0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
230f0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
23100 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
23110 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
23120 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23130 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
23140 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
23150 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
23160 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
23170 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
23180 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
23190 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
231a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
231b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
231c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
231d0 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
231e0 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
231f0 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
23200 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
23210 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
23220 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
23230 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
23240 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
23250 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
23260 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
23270 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
23280 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
23290 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
232a0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
232b0 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
232c0 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
232d0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
232e0 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
232f0 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
23300 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
23310 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
23320 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
23330 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
23340 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
23350 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
23360 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
23370 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
23380 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
23390 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
233a0 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
233b0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
233c0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
233d0 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
233e0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
233f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23400 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
23410 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
23420 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
23430 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
23440 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
23450 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
23460 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
23470 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
23480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23490 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
234a0 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
234b0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
234c0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
234d0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
234e0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
234f0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
23500 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
23510 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
23520 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
23530 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
23540 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
23550 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
23560 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
23570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23580 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23590 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
235a0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
235b0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
235c0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
235d0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
235e0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
235f0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
23600 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
23610 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
23620 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
23630 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
23640 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
23650 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
23660 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
23670 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
23680 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
23690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
236a0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
236b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
236c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
236d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
236e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
236f0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
23700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23710 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
23720 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23730 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
23740 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
23750 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23760 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
23770 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
23780 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
23790 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
237a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
237b0 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
237c0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
237d0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
237e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
237f0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23800 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
23810 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
23820 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
23830 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
23840 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
23850 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
23860 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
23870 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
23880 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
23890 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
238a0 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
238b0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
238c0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
238d0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
238e0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
238f0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
23900 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
23910 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
23920 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
23930 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
23940 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
23950 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
23960 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
23970 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
23980 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
23990 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
239a0 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
239b0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
239c0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
239d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
239e0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
239f0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
23a00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23a10 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23a20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23a30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23a40 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
23a50 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
23a60 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
23a70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23a80 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
23a90 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
23aa0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
23ab0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
23ac0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
23ad0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23ae0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
23af0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
23b00 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
23b10 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
23b20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23b30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
23b40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23b50 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
23b60 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
23b70 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
23b80 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23b90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
23ba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
23bb0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
23bc0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
23bd0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
23be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
23bf0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
23c00 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
23c10 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
23c20 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
23c30 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
23c40 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
23c50 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
23c60 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
23c70 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
23c80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
23c90 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
23ca0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
23cb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23cc0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23cd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23ce0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
23cf0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
23d00 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
23d10 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
23d20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23d30 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
23d40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23d50 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
23d60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
23d70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
23d80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23d90 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
23da0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
23db0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
23dc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23dd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23de0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
23df0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
23e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
23e10 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23e20 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
23e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23e40 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
23e50 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
23e60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
23e70 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
23e80 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
23e90 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
23ea0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
23eb0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
23ec0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
23ed0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
23ee0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
23ef0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
23f00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
23f10 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
23f20 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
23f30 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
23f40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23f50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23f60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23f70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
23f80 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
23f90 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
23fa0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
23fb0 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
23fc0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
23fd0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
23fe0 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
23ff0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
24000 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c  ate && pCur->atL
24010 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ast ){.#ifdef SQ
24020 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
24030 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
24040 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
24050 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
24060 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
24070 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
24080 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
24090 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
240a0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
240b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
240c0 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
240d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
240e0 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
240f0 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
24100 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
24110 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24120 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24130 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
24140 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24150 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
24160 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24170 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24180 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
24190 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
241a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
241b0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
241c0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
241d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
241e0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
241f0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
24200 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
24210 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
24220 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
24230 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24240 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
24250 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24270 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24280 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24290 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
242a0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
242b0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
242c0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
242d0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63  Cur->atLast = rc
242e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30  ==SQLITE_OK ?1:0
242f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24300 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
24310 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
24320 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
24330 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
24340 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
24350 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
24360 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
24370 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
24380 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
24390 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
243a0 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
243b0 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
243c0 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
243d0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
243e0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
243f0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
24400 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
24410 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
24420 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
24430 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
24440 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
24450 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
24460 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
24470 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
24480 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
24490 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
244a0 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
244b0 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
244c0 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
244d0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
244e0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
244f0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
24500 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
24510 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
24520 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
24530 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
24540 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
24550 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
24560 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
24570 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
24580 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
24590 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
245a0 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
245b0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
245c0 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
245d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
245e0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
245f0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
24600 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24610 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
24620 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
24630 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
24640 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
24660 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
24670 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
24680 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
24690 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
246a0 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
246b0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
246c0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
246d0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
246e0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
246f0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
24700 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
24710 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
24720 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
24730 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
24740 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
24770 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
24780 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
24790 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
247a0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
247b0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
247c0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
247d0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
247e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
247f0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
24800 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
24810 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24830 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
24840 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
24850 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
24860 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
24870 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
24880 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
24890 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
248a0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
248b0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
248c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
248d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
248e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
248f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24900 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24910 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
24920 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
24930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
24940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
24950 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
24960 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
24970 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24980 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
24990 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
249a0 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
249b0 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
249c0 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
249d0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
249e0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
249f0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
24a00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24a10 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
24a20 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
24a30 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
24a40 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
24a50 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
24a60 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
24a70 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
24a80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24a90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24aa0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
24ab0 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
24ac0 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
24ad0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
24ae0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
24af0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24b00 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
24b10 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
24b20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
24b30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24b40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
24b50 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
24b60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24b70 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
24b80 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
24b90 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
24ba0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24bb0 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
24bc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24bd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
24be0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
24bf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24c00 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
24c10 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
24c20 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
24c30 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
24c40 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
24c50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
24c60 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
24c70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24c80 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
24c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24ca0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24cb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
24cc0 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
24cd0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
24ce0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
24cf0 72 2c 20 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f  r, idx;.    Pgno
24d00 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
24d10 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
24d20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24d30 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
24d40 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   c;..    /* pPag
24d50 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
24d60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
24d70 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
24d80 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
24d90 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
24da0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
24db0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
24dc0 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
24dd0 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
24de0 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
24df0 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
24e00 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
24e10 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
24e20 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
24e30 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
24e40 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
24e50 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
24e60 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
24e70 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
24e80 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
24e90 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
24ea0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
24eb0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
24ec0 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
24ed0 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
24ee0 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
24ef0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
24f00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
24f10 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
24f20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
24f30 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
24f40 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
24f50 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
24f60 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
24f70 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
24f80 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
24f90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
24fa0 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 75 70  = (u16)(idx = up
24fb0 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
24fc0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
24fd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24fe0 28 75 31 36 29 28 69 64 78 20 3d 20 28 75 70 72  (u16)(idx = (upr
24ff0 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
25000 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
25010 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
25040 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
25050 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
25060 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
25070 3d 3d 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ==pCur->aiIdx[pC
25080 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
25090 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
250a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
250b0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
250c0 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
250d0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
250e0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
250f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
25100 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
25110 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
25120 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
25130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
25140 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
25150 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
25160 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
25170 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
25180 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
25190 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
251a0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
251b0 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
251c0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
251d0 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
251e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
251f0 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
25200 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
25210 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
25220 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
25230 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
25240 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
25250 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
25260 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d   }.        pCur-
25270 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
25280 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
25290 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
252a0 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
252b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
252c0 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
252d0 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
252e0 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
252f0 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
25300 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
25310 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
25320 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
25330 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
25340 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
25350 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
25360 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
25370 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
25380 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
25390 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
253a0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
253b0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
253c0 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
253d0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
253e0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
253f0 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
25400 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
25410 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
25420 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
25430 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
25440 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
25450 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
25460 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
25470 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
25480 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
25490 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
254a0 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
254b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28  ;.        if( !(
254c0 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 0a 20 20  nCell & 0x80).  
254d0 20 20 20 20 20 20 20 26 26 20 6e 43 65 6c 6c 3c         && nCell<
254e0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
254f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 43  .         && (pC
25500 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 29 3c 3d 70 50  ell+nCell+1)<=pP
25510 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 0a 20 20  age->aDataEnd.  
25520 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25530 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
25540 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
25550 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
25560 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
25570 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
25580 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
25590 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
255a0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
255b0 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
255c0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
255d0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
255e0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
255f0 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
25600 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
25610 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
25620 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
25630 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
25640 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
25650 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
25660 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
25670 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
25680 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
25690 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
256a0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
256b0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
256c0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  al.          && 
256d0 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 29 3c  (pCell+nCell+2)<
256e0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
256f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
25700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
25710 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
25720 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
25730 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
25740 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
25750 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
25760 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
25770 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
25780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
25790 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
257a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
257b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
257c0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
257d0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
257e0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
257f0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
25800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25810 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
25820 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
25830 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
25840 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
25850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
25860 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
25870 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
25880 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
25890 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
258a0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
258b0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
258c0 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
258d0 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
258e0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
258f0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
25900 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25910 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
25920 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
25930 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
25940 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
25950 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
25960 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
25970 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
25980 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
25990 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
259a0 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
259b0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
259c0 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
259d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
259e0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
259f0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
25a00 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
25a10 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
25a20 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
25a30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25a40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
25a50 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
25a60 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
25a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
25a80 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
25a90 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
25aa0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
25ab0 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
25ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25ae0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
25af0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
25b00 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
25b10 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
25b20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
25b30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
25b40 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
25b50 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
25b60 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
25b70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
25b80 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
25b90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25ba0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
25bb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
25bc0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
25bd0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
25be0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
25bf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25c00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25c10 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
25c20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
25c30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25c40 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
25c50 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
25c60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25c70 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
25c80 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
25c90 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
25ca0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
25cb0 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
25cc0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
25cd0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
25ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
25cf0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25d00 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
25d10 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
25d20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  2);.    }.    as
25d30 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
25d40 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
25d50 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
25d60 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
25d70 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
25d80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
25d90 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
25da0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
25db0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
25dc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
25dd0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
25de0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
25df0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
25e00 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
25e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
25e20 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
25e30 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
25e40 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
25e50 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
25e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25e70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25e80 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
25e90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25ea0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
25eb0 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
25ec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25ed0 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
25ee0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
25ef0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
25f00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
25f10 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
25f20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
25f30 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
25f40 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
25f50 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25f60 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
25f70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
25f80 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
25f90 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
25fa0 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
25fb0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
25fc0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
25fd0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
25fe0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
25ff0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
26000 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
26010 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
26020 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
26030 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
26040 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
26050 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
26060 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
26070 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
26080 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
26090 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
260a0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
260b0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
260c0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
260d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
260e0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
260f0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
26100 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
26110 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
26120 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
26130 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
26140 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
26150 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
26160 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
26170 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
26180 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
26190 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
261a0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
261b0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
261c0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
261d0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
261e0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
261f0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
26200 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
26210 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
26220 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
26230 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
26240 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
26250 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
26260 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
26270 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
26280 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
26290 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
262a0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
262b0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
262c0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
262d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
262e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
262f0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
26300 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
26310 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26320 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26330 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26340 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
26350 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
26360 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
26370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
26390 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
263a0 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res!=0 );.  if( 
263b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
263c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
263d0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
263e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
263f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
26400 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
26410 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
26420 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
26430 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
26440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26450 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
26460 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
26470 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
26480 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26490 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
264a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
264b0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
264c0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
264d0 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50   assert( idx<=pP
264e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
264f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
26500 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
26510 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
26520 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
26530 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
26540 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
26550 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
26560 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
26570 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
26580 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
26590 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
265a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
265b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
265c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
265d0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
265e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
265f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26600 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
26610 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
26620 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
26630 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
26640 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
26650 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
26660 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26670 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
26680 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
26690 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
266a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
266b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
266c0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
266d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
266e0 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
266f0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
26700 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
26710 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
26720 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26730 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
26740 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
26750 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
26760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26770 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26780 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
26790 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
267a0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
267b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
267c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
267d0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
267e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
267f0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
26800 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
26810 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
26820 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
26830 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
26840 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
26850 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
26860 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
26870 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
26880 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
26890 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
268a0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
268b0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
268c0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
268d0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
268e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
268f0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
26900 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
26910 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
26920 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
26930 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26940 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26950 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
26960 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
26970 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
26980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
269a0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
269b0 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
269c0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
269d0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
269e0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
269f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26a00 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
26a10 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
26a20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
26a30 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
26a40 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
26a50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
26a60 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
26a70 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
26a80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26a90 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
26aa0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
26ab0 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
26ac0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
26ad0 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
26ae0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26af0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
26b00 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
26b10 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
26b20 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
26b30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
26b40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26b50 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
26b60 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
26b70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
26b80 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
26b90 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
26bb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
26bc0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
26bd0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
26be0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
26bf0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
26c00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26c10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
26c20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
26c30 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
26c40 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
26c50 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
26c60 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
26c70 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
26c80 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
26c90 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
26ca0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26cb0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
26cc0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
26cd0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
26ce0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
26cf0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
26d00 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
26d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
26d40 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
26d50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
26d60 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
26d70 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
26d80 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
26d90 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
26da0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
26db0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
26dc0 73 2c 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65  s, btreeMakePage
26dd0 57 72 69 74 65 61 62 6c 65 28 29 0a 2a 2a 20 68  Writeable().** h
26de0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26df0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
26e00 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
26e10 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
26e20 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
26e30 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
26e40 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
26e50 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
26e60 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
26e70 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
26e80 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
26e90 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
26ea0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26eb0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
26ec0 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
26ed0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
26ee0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
26ef0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
26f00 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
26f10 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
26f20 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
26f30 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
26f40 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
26f50 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
26f60 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
26f70 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
26f80 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
26f90 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
26fa0 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
26fb0 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
26fc0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
26fd0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
26fe0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
26ff0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
27000 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
27010 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
27020 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
27030 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
27040 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
27050 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
27060 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
27070 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
27080 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
27090 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
270a0 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
270b0 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
270c0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
270d0 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
270e0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
270f0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
27100 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
27110 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
27120 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
27130 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
27140 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
27150 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
27160 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
27170 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
27180 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
27190 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
271a0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
271b0 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
271c0 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
271d0 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
271e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
271f0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
27200 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
27210 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
27220 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
27230 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
27240 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
27250 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
27260 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
27270 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
27280 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
27290 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
272a0 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
272b0 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
272c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
272d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
272e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
272f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
27300 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
27310 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
27320 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
27330 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
27340 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
27350 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27360 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
27370 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
27380 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
27390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
273a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
273b0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
273c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
273d0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
273e0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
273f0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
27400 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
27410 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
27420 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
27430 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
27440 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
27450 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
27460 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
27470 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
27480 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
27490 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
274a0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
274b0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
274c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
274d0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
274e0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
274f0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
27500 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
27510 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
27520 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
27530 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
27540 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27550 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
27560 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
27570 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
27580 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
27590 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
275a0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
275b0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
275c0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
275d0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
275e0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
275f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
27600 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27610 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
27620 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
27630 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
27640 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
27650 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
27660 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
27670 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
27680 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
27690 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
276a0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
276b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
276c0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
276d0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
276e0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
276f0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
27700 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27710 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69  btreeMakePageWri
27720 74 65 61 62 6c 65 28 70 50 61 67 65 31 29 3b 0a  teable(pPage1);.
27730 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27740 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
27750 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
27760 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
27770 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
27780 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
27790 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
277a0 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
277b0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
277c0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
277d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
277e0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
277f0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
27800 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
27810 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
27820 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
27830 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
27840 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
27850 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
27860 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
27870 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
27880 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
27890 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
278a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
278b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
278c0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
278d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
278e0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
278f0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
27900 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
27910 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
27920 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
27930 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27940 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27950 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
27960 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
27970 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
27980 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
27990 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
279a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
279b0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
279c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
279d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
279e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
279f0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
27a00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27a10 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
27a20 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20  0 );..      k = 
27a30 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
27a40 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20  ->aData[4]); /* 
27a50 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  # of leaves on t
27a60 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  his trunk page *
27a70 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  /.      if( k==0
27a80 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
27a90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27aa0 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
27ab0 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
27ac0 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
27ad0 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
27ae0 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
27af0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
27b00 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
27b10 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
27b20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
27b30 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
27b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
27b50 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
27b60 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
27b70 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c  MakePageWriteabl
27b80 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  e(pTrunk);.     
27b90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27ba0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27bb0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27bd0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
27be0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
27bf0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27c00 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
27c10 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
27c20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
27c30 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
27c40 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
27c50 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
27c60 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
27c70 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
27c80 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
27c90 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
27ca0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
27cb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
27cc0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
27cd0 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
27ce0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
27cf0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
27d00 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
27d10 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
27d20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
27d30 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
27d40 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
27d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27d60 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
27d70 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
27d80 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
27d90 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
27da0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
27db0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
27dc0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
27dd0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
27de0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
27df0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
27e00 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
27e10 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
27e20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
27e30 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
27e40 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
27e50 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
27e60 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
27e70 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
27e80 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50   rc = btreeMakeP
27e90 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 54 72  ageWriteable(pTr
27ea0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  unk);.        if
27eb0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
27ec0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
27ed0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
27ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27ef0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
27f00 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
27f10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
27f20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
27f30 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
27f40 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
27f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
27f60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
27f70 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61  rc = btreeMakePa
27f80 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 72 65  geWriteable(pPre
27f90 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  vTrunk);.       
27fa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27fc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27fd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27ff0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28000 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
28010 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
28020 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
28030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28050 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
28060 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
28070 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
28080 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
28090 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
280a0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
280b0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
280c0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
280d0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
280e0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
280f0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
28100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28110 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
28120 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
28130 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
28140 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
28150 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
28160 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
28170 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
28180 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28190 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
281a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
281b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
281c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
281d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
281e0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
281f0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
28200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
28210 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
28220 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
28230 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
28240 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28260 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28270 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28280 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28290 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d       rc = btreeM
282a0 61 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65  akePageWriteable
282b0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
282c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
282d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
282e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
282f0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
28300 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
28310 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28320 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
28330 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28340 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
28350 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
28360 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
28370 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28380 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
28390 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
283a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
283b0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
283c0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
283d0 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
283e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
283f0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
28400 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
28410 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
28420 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
28430 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28440 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28450 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
28460 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
28470 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
28480 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
28490 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
284a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
284b0 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b     rc = btreeMak
284c0 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70  ePageWriteable(p
284d0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
284e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
284f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28500 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
28510 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
28520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28530 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
28540 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
28550 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
28560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28570 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
28580 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
28590 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
285a0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
285b0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
285c0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
285d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
285e0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
285f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
28600 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
28610 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
28620 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
28630 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
28640 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
28650 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
28660 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
28670 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
28680 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
28690 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
286a0 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
286b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
286c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
286d0 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
286e0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
286f0 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
28700 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
28710 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
28720 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
28730 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
28740 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
28750 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
28760 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
28770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
28780 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
28790 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
287a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
287b0 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
287c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
287d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
287e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
287f0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
28800 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28810 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
28820 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
28830 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
28840 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
28850 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
28860 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
28870 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
28880 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
28890 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
288a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
288b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
288c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
288d0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
288e0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
288f0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
28900 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
28910 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
28920 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
28930 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
28940 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
28950 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
28960 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
28970 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
28980 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
28990 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
289a0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
289b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
289c0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
289d0 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
289e0 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
289f0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
28a00 65 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61 62  eMakePageWriteab
28a10 6c 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  le(pTrunk);.    
28a20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
28a30 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
28a40 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
28a50 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
28a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28a70 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
28a80 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
28a90 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
28aa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28ab0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
28ac0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
28ad0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
28ae0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
28af0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
28b00 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
28b10 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
28b20 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
28b30 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
28b40 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
28b50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
28b70 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67  c = btreeMakePag
28b80 65 57 72 69 74 65 61 62 6c 65 28 2a 70 70 50 61  eWriteable(*ppPa
28b90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
28ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28bb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28bc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28bd0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
28be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
28c00 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
28c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28c20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28c30 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
28c40 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
28c50 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
28c60 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
28c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
28c80 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
28c90 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
28ca0 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
28cb0 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
28cc0 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
28cd0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
28ce0 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
28cf0 72 69 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 50  riteable(pBt->pP
28d00 61 67 65 31 29 3b 0a 20 20 20 20 69 66 28 20 72  age1);.    if( r
28d10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28d20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
28d30 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
28d40 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
28d50 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
28d60 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
28d70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28d80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28d90 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28da0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
28db0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
28dc0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
28dd0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
28de0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
28df0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
28e00 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
28e10 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
28e20 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
28e30 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
28e40 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
28e50 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
28e60 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
28e70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
28e80 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
28e90 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
28ea0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
28eb0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
28ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
28ed0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
28ee0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
28ef0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
28f00 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
28f10 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
28f20 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
28f30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
28f40 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
28f50 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
28f60 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
28f70 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  ge, &pPg, 1);.  
28f80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28fa0 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50   rc = btreeMakeP
28fb0 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 67  ageWriteable(pPg
28fc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
28fd0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
28fe0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
28ff0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29000 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
29010 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
29020 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
29030 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29040 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
29050 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
29060 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
29070 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
29080 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
29090 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
290a0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
290b0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
290c0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
290d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
290e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
290f0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
29100 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  o, ppPage, 1);. 
29110 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29120 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
29130 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69  btreeMakePageWri
29140 74 65 61 62 6c 65 28 2a 70 70 50 61 67 65 29 3b  teable(*ppPage);
29150 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29170 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
29180 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
29190 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
291a0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
291b0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
291c0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
291d0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
291e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
291f0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
29200 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
29210 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
29220 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
29230 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
29240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29250 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
29260 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
29270 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
29280 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
29290 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
292a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
292b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
292c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
292d0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
292e0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
292f0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
29300 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
29310 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
29320 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
29330 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
29340 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
29350 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29360 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
29370 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
29380 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
29390 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
293a0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
293b0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
293c0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
293d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
293e0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
293f0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
29400 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
29410 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
29420 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
29430 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
29440 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
29450 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
29460 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
29470 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
29480 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
29490 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
294a0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
294b0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
294c0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
294d0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
294e0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
294f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
29500 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
29510 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
29520 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
29530 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
29540 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
29550 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
29560 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
29570 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
29580 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
29590 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
295a0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
295b0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
295c0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
295d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295e0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
295f0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
29600 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29630 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
29640 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
29650 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
29660 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
29670 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
29680 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
29690 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
296a0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
296b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
296c0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
296d0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
296e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
29710 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
29720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29740 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
29750 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
29760 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
29770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29780 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
29790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
297a0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
297b0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
297c0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
297d0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
297e0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
297f0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
29800 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
29810 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
29820 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
29830 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
29840 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
29850 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
29860 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
29870 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
29880 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
29890 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67  c = btreeMakePag
298a0 65 57 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  eWriteable(pPage
298b0 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
298c0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
298d0 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
298e0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
298f0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
29900 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29910 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
29920 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73  );..  if( pBt->s
29930 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20  ecureDelete ){. 
29940 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
29950 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
29960 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
29970 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
29980 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
29990 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
299a0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
299b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
299c0 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
299d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
299e0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
299f0 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
29a00 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
29a10 28 28 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65  ((rc = btreeMake
29a20 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50  PageWriteable(pP
29a30 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
29a40 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
29a50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
29a60 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
29a70 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
29a80 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
29a90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
29aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
29ab0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
29ac0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
29ad0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
29ae0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
29af0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
29b00 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
29b10 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
29b20 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
29b30 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
29b40 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
29b50 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
29b60 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
29b70 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
29b80 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
29b90 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
29ba0 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
29bb0 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
29bc0 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
29bd0 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
29be0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
29bf0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
29c00 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
29c10 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
29c20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
29c30 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
29c40 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
29c50 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
29c60 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
29c70 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
29c80 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
29c90 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
29ca0 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
29cb0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
29cc0 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
29cd0 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
29ce0 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
29cf0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
29d00 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
29d10 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
29d20 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
29d30 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
29d40 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
29d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
29d60 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
29d70 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
29d80 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
29d90 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
29da0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
29db0 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
29dc0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
29dd0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
29de0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
29df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29e00 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
29e10 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
29e20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
29e30 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
29e40 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
29e50 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
29e60 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
29e70 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
29e80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
29e90 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
29ea0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29eb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
29ec0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
29ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
29ee0 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
29ef0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
29f00 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
29f10 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
29f20 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
29f30 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
29f40 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
29f50 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
29f60 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
29f70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
29f80 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
29f90 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
29fa0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
29fb0 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
29fc0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
29fd0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
29fe0 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
29ff0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
2a000 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
2a010 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
2a020 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
2a030 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
2a040 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
2a050 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
2a060 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
2a070 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
2a080 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
2a090 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
2a0a0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2a0b0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
2a0c0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
2a0d0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
2a0e0 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
2a0f0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
2a100 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
2a110 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
2a120 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2a130 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
2a140 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
2a150 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
2a160 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
2a170 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2a180 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
2a190 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
2a1a0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
2a1b0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
2a1c0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
2a1d0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
2a1e0 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
2a1f0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
2a200 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
2a210 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
2a220 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
2a230 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
2a240 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
2a250 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
2a260 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
2a270 65 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61 62  eMakePageWriteab
2a280 6c 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  le(pTrunk);.    
2a290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2a2b0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2a2c0 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
2a2d0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
2a2e0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2a2f0 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
2a300 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
2a310 20 69 66 28 20 70 50 61 67 65 20 26 26 20 21 70   if( pPage && !p
2a320 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
2a330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2a340 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2a350 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2a360 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2a370 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2a380 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2a390 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2a3a0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2a3b0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2a3c0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2a3d0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2a3e0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2a3f0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2a400 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2a410 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2a420 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2a430 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2a440 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2a450 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2a460 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2a470 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2a480 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2a490 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2a4a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2a4b0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2a4c0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2a4d0 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2a4e0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2a4f0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2a500 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2a510 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2a520 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2a530 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2a540 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2a550 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2a560 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2a570 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2a580 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2a590 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2a5a0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2a5b0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2a5c0 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2a5d0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2a5e0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2a5f0 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72   btreeMakePageWr
2a600 69 74 65 61 62 6c 65 28 70 50 61 67 65 29 3b 0a  iteable(pPage);.
2a610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a620 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2a630 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2a640 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2a650 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2a660 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2a670 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2a680 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2a690 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2a6a0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2a6b0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2a6c0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2a6d0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2a6e0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2a6f0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2a700 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2a710 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2a720 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2a730 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2a740 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2a750 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2a760 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a770 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2a780 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2a790 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2a7a0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2a7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2a7c0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2a7d0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2a7e0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2a7f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2a800 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2a810 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2a820 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2a830 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
2a840 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
2a850 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
2a860 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2a870 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
2a880 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2a890 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2a8a0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2a8b0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2a8c0 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2a8d0 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2a8e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a8f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a900 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a910 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2a920 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2a930 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2a940 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2a950 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
2a960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
2a970 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
2a980 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
2a990 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
2a9a0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2a9b0 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
2a9c0 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
2a9d0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
2a9e0 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
2a9f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2aa00 55 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  UPT;  /* Cell ex
2aa10 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2aa20 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2aa30 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2aa40 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2aa50 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2aa60 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2aa70 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2aa80 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2aa90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2aaa0 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2aab0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2aac0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2aad0 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2aae0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2aaf0 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2ab00 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2ab10 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2ab20 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2ab30 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2ab40 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2ab50 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2ab60 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2ab70 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2ab80 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2ab90 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2aba0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2abb0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2abc0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2abd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2abe0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2abf0 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2ac00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2ac10 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2ac20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2ac30 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2ac40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ac50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ac60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2ac70 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2ac80 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2ac90 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2aca0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2acb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2acc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2acd0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2ace0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2acf0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2ad00 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2ad10 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2ad20 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2ad30 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2ad40 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2ad50 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2ad60 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2ad70 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2ad80 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2ad90 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2ada0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2adb0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2adc0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2add0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2ade0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2adf0 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2ae00 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2ae10 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2ae20 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2ae30 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2ae40 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2ae50 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2ae60 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2ae70 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2ae80 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2ae90 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2aea0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2aeb0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2aec0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2aed0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2aee0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2aef0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2af00 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2af10 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2af20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2af30 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2af40 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2af50 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2af60 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2af70 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2af80 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2af90 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2afa0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2afb0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2afc0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2afd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2afe0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2aff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2b000 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2b010 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2b020 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2b030 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2b040 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b050 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2b060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b070 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b080 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2b090 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2b0a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b0b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2b0c0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2b0d0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2b0e0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2b0f0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2b100 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2b110 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2b120 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2b130 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2b140 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2b150 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2b160 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2b170 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2b180 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2b190 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2b1a0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2b1b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2b1c0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2b1d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b1e0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2b1f0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2b200 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2b210 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2b220 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2b230 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2b240 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2b250 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2b260 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2b270 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2b280 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2b290 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2b2a0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2b2b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b2c0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2b2d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b2f0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2b300 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2b310 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2b320 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2b330 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2b340 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2b350 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2b360 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2b370 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2b380 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2b390 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2b3a0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2b3b0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3d0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2b3e0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2b3f0 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2b400 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b420 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2b430 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2b440 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2b450 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2b460 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2b470 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2b480 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2b490 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2b4a0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2b4b0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2b4c0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2b4d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2b4e0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2b4f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2b500 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2b510 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2b520 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2b530 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2b540 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b550 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2b560 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2b570 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2b580 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2b590 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2b5a0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2b5b0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2b5c0 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2b5d0 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2b5e0 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2b5f0 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2b600 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2b610 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2b620 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2b630 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2b640 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2b650 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b660 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2b670 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2b680 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2b690 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2b6a0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2b6b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2b6c0 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2b6d0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2b6e0 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2b6f0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2b700 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2b710 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
2b720 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
2b730 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
2b740 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
2b750 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2b760 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
2b770 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
2b780 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2b790 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2b7a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2b7b0 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
2b7c0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2b7d0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2b7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2b7f0 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
2b800 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
2b810 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2b820 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
2b830 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
2b840 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
2b850 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2b860 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2b870 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2b880 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2b890 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2b8a0 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2b8b0 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2b8c0 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2b8d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b8e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b8f0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2b900 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
2b910 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2b920 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2b930 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
2b940 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
2b950 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
2b960 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
2b970 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
2b980 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
2b990 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
2b9a0 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
2b9b0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2b9c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2b9d0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2b9e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b9f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ba00 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2ba10 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2ba20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2ba30 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2ba40 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2ba50 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2ba60 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2ba70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2ba80 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2ba90 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2baa0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2bab0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2bac0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2bad0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2bae0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2baf0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2bb00 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2bb10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2bb20 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2bb30 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2bb40 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2bb50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2bb60 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2bb70 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2bb80 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2bb90 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2bba0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2bbb0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2bbc0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2bbd0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2bbe0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2bbf0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2bc00 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2bc10 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2bc20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2bc30 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2bc40 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2bc50 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2bc60 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2bc70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2bc80 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2bc90 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2bca0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2bcb0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2bcc0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2bcd0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2bce0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2bcf0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2bd00 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2bd10 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2bd20 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
2bd30 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2bd40 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2bd50 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2bd60 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2bd70 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2bd80 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2bd90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bda0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2bdb0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2bdc0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2bdd0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2bde0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2bdf0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2be00 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2be10 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2be20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2be30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2be40 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2be50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2be60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2be70 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2be80 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2be90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2bea0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2beb0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2bec0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2bed0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2bee0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2bef0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2bf00 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2bf10 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2bf20 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2bf30 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2bf40 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2bf50 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2bf60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bf70 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2bf80 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2bf90 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2bfa0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2bfb0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2bfc0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2bfd0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2bfe0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2bff0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2c000 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2c010 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2c020 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2c030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2c040 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2c050 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c060 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2c070 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2c080 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2c090 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2c0a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c0b0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2c0c0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2c0d0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2c0e0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2c0f0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2c100 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2c110 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2c120 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2c130 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2c140 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2c150 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2c160 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2c170 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2c180 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2c190 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2c1a0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2c1b0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2c1c0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2c1d0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2c1e0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2c1f0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2c200 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2c210 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2c220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2c230 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2c240 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c250 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2c260 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2c270 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2c280 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2c290 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2c2a0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2c2b0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2c2c0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2c2d0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2c2e0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2c2f0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2c300 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2c310 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2c320 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2c330 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2c340 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c350 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2c360 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2c370 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2c380 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2c390 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2c3a0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2c3b0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2c3c0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2c3d0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2c3e0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2c3f0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2c400 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2c410 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2c420 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2c430 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2c440 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2c450 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2c460 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2c470 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2c480 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2c490 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c4a0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2c4b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c4c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2c4d0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2c4e0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2c4f0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2c500 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2c510 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2c520 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2c530 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2c540 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2c550 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2c560 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2c570 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2c580 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2c590 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2c5a0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2c5b0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2c5c0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2c5d0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2c5e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c5f0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2c600 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2c610 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2c620 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2c630 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2c640 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
2c650 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2c660 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2c670 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2c680 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2c690 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2c6a0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2c6b0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2c6c0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2c6d0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2c6e0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2c6f0 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45  endPtr;     /* E
2c700 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  nd of loop */.  
2c710 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2c720 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2c730 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
2c740 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2c750 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
2c760 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
2c770 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
2c780 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
2c790 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2c7a0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2c7b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2c7c0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2c7d0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
2c7e0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
2c7f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c800 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c810 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2c820 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c830 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2c840 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c850 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2c860 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
2c870 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
2c880 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
2c890 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
2c8a0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2c8b0 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
2c8c0 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
2c8d0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
2c8e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
2c8f0 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
2c900 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2c910 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
2c920 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2c930 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2c940 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2c950 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2c960 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2c970 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2c980 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2c990 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2c9a0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2c9b0 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2c9c0 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2c9d0 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d  ;.  }.  endPtr =
2c9e0 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2c9f0 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x[2*pPage->nCell
2ca00 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28   - 2];.  assert(
2ca10 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2ca20 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2ca30 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2ca40 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2ca50 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ed */.  while( p
2ca60 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20  tr<endPtr ){.   
2ca70 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28   *(u16*)ptr = *(
2ca80 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20  u16*)&ptr[2];.  
2ca90 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a    ptr += 2;.  }.
2caa0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
2cab0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2cac0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
2cad0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
2cae0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d  e->nFree += 2;.}
2caf0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2cb00 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
2cb10 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
2cb20 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
2cb30 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
2cb40 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
2cb50 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2cb60 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
2cb70 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
2cb80 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
2cb90 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
2cba0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
2cbb0 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
2cbc0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2cbd0 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
2cbe0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
2cbf0 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
2cc00 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
2cc10 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
2cc20 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
2cc30 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2cc40 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2cc50 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2cc60 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2cc70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2cc80 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2cc90 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2cca0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2ccb0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2ccc0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2ccd0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2cce0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2ccf0 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2cd00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2cd10 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2cd20 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2cd30 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2cd40 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2cd50 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2cd60 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2cd70 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2cd80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2cd90 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2cda0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2cdb0 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2cdc0 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2cdd0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2cde0 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2cdf0 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2ce00 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2ce10 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2ce20 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2ce30 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2ce40 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2ce50 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2ce60 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2ce70 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2ce80 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2ce90 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2cea0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2ceb0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2cec0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2ced0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2cee0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2cef0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2cf00 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2cf10 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2cf20 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2cf30 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2cf40 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2cf50 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2cf60 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2cf70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2cf80 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2cf90 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2cfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2cfb0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2cfc0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2cfd0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2cfe0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2cff0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2d000 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2d010 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2d020 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2d030 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2d040 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2d050 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d060 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2d070 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2d080 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2d090 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2d0a0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2d0b0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2d0c0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2d0d0 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2d0e0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2d0f0 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2d100 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2d110 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2d120 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2d130 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2d140 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2d150 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
2d160 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2d170 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
2d180 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
2d190 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2d1a0 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f  *endPtr;       /
2d1b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2d1c0 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69  p */..  int nSki
2d1d0 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
2d1e0 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
2d1f0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2d200 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2d210 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
2d220 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2d230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d240 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
2d250 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2d260 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2d270 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
2d280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d290 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2d2a0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
2d2b0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
2d2c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d2d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2d2e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
2d2f0 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
2d300 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
2d310 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
2d320 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
2d330 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
2d340 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
2d350 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
2d360 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
2d370 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
2d380 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
2d390 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
2d3a0 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
2d3b0 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
2d3c0 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
2d3d0 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
2d3e0 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
2d3f0 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
2d400 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
2d410 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
2d420 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
2d430 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
2d440 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
2d450 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
2d460 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2d470 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
2d480 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
2d490 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2d4a0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
2d4b0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
2d4c0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
2d4d0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2d4e0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
2d4f0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2d500 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
2d510 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
2d520 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
2d530 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2d540 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
2d550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
2d560 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d570 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2d580 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
2d590 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
2d5a0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
2d5b0 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
2d5c0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
2d5d0 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
2d5e0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
2d5f0 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  idx = (u16)i;.  
2d600 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
2d610 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67  c = btreeMakePag
2d620 65 57 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  eWriteable(pPage
2d630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d650 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2d660 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2d670 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2d680 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2d690 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2d6a0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
2d6b0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2d6c0 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
2d6d0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
2d6e0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
2d6f0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2d700 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2d710 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
2d720 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
2d730 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
2d740 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
2d750 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
2d760 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
2d770 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
2d780 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
2d790 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
2d7a0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
2d7b0 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20  two properties. 
2d7c0 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
2d7d0 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  rns success */. 
2d7e0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
2d7f0 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61  = end+2 );.    a
2d800 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
2d810 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
2d820 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2d830 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
2d840 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
2d850 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
2d860 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
2d870 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
2d880 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
2d890 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2d8a0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2d8b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
2d8c0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
2d8d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20  ;.    }.    ptr 
2d8e0 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20  = &data[end];.  
2d8f0 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61    endPtr = &data
2d900 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72  [ins];.    asser
2d910 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  t( (SQLITE_PTR_T
2d920 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30  O_INT(ptr)&1)==0
2d930 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61   );  /* ptr is a
2d940 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69  lways 2-byte ali
2d950 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c  gned */.    whil
2d960 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b  e( ptr>endPtr ){
2d970 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74  .      *(u16*)pt
2d980 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b  r = *(u16*)&ptr[
2d990 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d  -2];.      ptr -
2d9a0 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 2;.    }.    p
2d9b0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
2d9c0 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
2d9d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
2d9e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
2d9f0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
2da00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2da10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2da20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2da30 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2da40 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
2da50 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
2da60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2da70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2da80 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
2da90 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
2daa0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2dab0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
2dac0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
2dad0 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
2dae0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
2daf0 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
2db00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2db10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
2db20 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
2db30 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
2db40 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
2db50 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
2db60 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
2db70 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
2db80 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
2db90 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
2dba0 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
2dbb0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2dbc0 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
2dbd0 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
2dbe0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
2dbf0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
2dc00 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
2dc10 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
2dc20 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
2dc30 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
2dc40 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
2dc50 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
2dc60 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2dc70 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
2dc80 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2dc90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2dca0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  unter */.  u8 *p
2dcb0 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20  Cellptr;     /* 
2dcc0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2dcd0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
2dce0 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
2dcf0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2dd00 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
2dd10 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
2dd20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2dd30 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2dd40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2dd50 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a  data for pPage *
2dd60 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  /.  const int hd
2dd70 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2dd80 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
2dd90 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
2dda0 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  der on pPage */.
2ddb0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61    const int nUsa
2ddc0 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ble = pPage->pBt
2ddd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  ->usableSize; /*
2dde0 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
2ddf0 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
2de00 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2de10 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
2de20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2de30 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2de40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2de50 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
2de60 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d  && nCell<=(int)M
2de70 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2de80 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t).            &
2de90 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70  & (int)MX_CELL(p
2dea0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
2deb0 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
2dec0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ded0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2dee0 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2def0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2df00 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2df10 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2df20 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2df30 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2df40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2df50 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
2df60 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
2df70 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
2df80 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e  llptr = &pPage->
2df90 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32  aCellIdx[nCell*2
2dfa0 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
2dfb0 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
2dfc0 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
2dfd0 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  i--){.    u16 sz
2dfe0 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20   = aSize[i];.   
2dff0 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a   pCellptr -= 2;.
2e000 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20      cellbody -= 
2e010 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  sz;.    put2byte
2e020 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
2e030 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
2e040 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
2e050 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  , apCell[i], sz)
2e060 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
2e070 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
2e080 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
2e090 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
2e0a0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2e0b0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
2e0c0 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
2e0d0 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
2e0e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
2e0f0 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
2e100 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2e110 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
2e120 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
2e130 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
2e140 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
2e150 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
2e160 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
2e170 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
2e180 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2e190 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
2e1a0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
2e1b0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2e1c0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2e1d0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
2e1e0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2e1f0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
2e200 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
2e210 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
2e220 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
2e230 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2e240 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
2e250 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
2e260 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
2e270 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
2e280 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
2e290 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
2e2a0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
2e2b0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
2e2c0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
2e2d0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
2e2e0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
2e2f0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
2e300 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
2e310 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
2e320 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
2e330 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
2e340 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
2e350 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
2e360 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
2e370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e380 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2e390 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2e3a0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
2e3b0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
2e3c0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
2e3d0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
2e3e0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
2e3f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e400 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2e410 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
2e420 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
2e430 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
2e440 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
2e450 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
2e460 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
2e470 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
2e480 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
2e490 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
2e4a0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
2e4b0 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
2e4c0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
2e4d0 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
2e4e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
2e4f0 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
2e500 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
2e510 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
2e520 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
2e530 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
2e540 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2e550 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2e560 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
2e570 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
2e580 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
2e590 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
2e5a0 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
2e5b0 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
2e5c0 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
2e5d0 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
2e5e0 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
2e5f0 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
2e600 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
2e610 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
2e620 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
2e630 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
2e640 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
2e650 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
2e660 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
2e670 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2e680 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
2e690 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
2e6a0 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
2e6b0 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
2e6c0 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
2e6d0 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
2e6e0 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
2e6f0 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
2e700 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
2e710 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2e720 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
2e730 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
2e740 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
2e750 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
2e760 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
2e770 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2e780 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
2e790 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
2e7a0 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
2e7b0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2e7c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
2e7d0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2e7e0 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
2e7f0 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
2e800 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
2e810 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
2e820 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
2e830 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
2e840 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
2e850 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2e860 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
2e870 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
2e880 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
2e890 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
2e8a0 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
2e8b0 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
2e8c0 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
2e8d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
2e8e0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2e8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
2e900 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
2e910 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e940 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
2e950 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2e980 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
2e990 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e9a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2e9b0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2e9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e9d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e9e0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2e9f0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2ea00 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2ea10 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
2ea20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
2ea30 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
2ea40 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
2ea50 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
2ea60 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  on */.  if( pPag
2ea70 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65  e->nCell<=0 ) re
2ea80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2ea90 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
2eaa0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2eab0 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
2eac0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2ead0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
2eae0 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
2eaf0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2eb00 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
2eb10 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
2eb20 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
2eb30 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
2eb40 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
2eb50 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
2eb60 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
2eb70 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
2eb80 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2eb90 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2eba0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
2ebb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ebc0 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
2ebd0 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
2ebe0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
2ebf0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
2ec00 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73  pCell;.    u16 s
2ec10 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
2ec20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2ec30 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
2ec40 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
2ec50 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2ec60 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
2ec70 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
2ec80 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
2ec90 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
2eca0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2ecb0 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
2ecc0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
2ecd0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2ece0 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2ecf0 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
2ed00 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
2ed10 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20  ll, &szCell);.. 
2ed20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2ed30 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2ed40 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
2ed50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2ed60 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
2ed70 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
2ed80 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
2ed90 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
2eda0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2edb0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
2edc0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2edd0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
2ede0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
2edf0 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
2ee00 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
2ee10 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
2ee20 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
2ee30 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
2ee40 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
2ee50 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
2ee60 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
2ee70 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
2ee80 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
2ee90 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
2eea0 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
2eeb0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
2eec0 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
2eed0 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
2eee0 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
2eef0 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
2ef00 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
2ef10 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
2ef20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2ef30 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2ef40 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
2ef50 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
2ef60 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
2ef70 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
2ef80 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
2ef90 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
2efa0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
2efb0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2efc0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
2efd0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
2efe0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
2eff0 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
2f000 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
2f010 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
2f020 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
2f030 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
2f040 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
2f050 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
2f060 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
2f070 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
2f080 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
2f090 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
2f0a0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
2f0b0 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
2f0c0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
2f0d0 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
2f0e0 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
2f0f0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
2f100 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
2f110 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
2f120 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
2f130 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
2f140 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
2f150 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
2f160 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
2f170 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
2f180 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
2f190 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
2f1a0 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
2f1b0 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
2f1c0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
2f1d0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2f1e0 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
2f1f0 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
2f200 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
2f210 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
2f220 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
2f230 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
2f240 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
2f250 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
2f260 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
2f270 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
2f280 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
2f290 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2f2a0 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
2f2b0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2f2c0 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
2f2d0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2f2e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
2f2f0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2f300 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2f310 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
2f320 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2f330 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
2f340 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
2f350 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
2f360 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
2f370 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
2f380 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
2f390 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
2f3a0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
2f3b0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
2f3c0 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
2f3d0 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
2f3e0 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
2f3f0 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
2f400 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
2f410 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
2f420 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
2f430 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
2f440 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
2f450 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
2f460 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
2f470 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
2f480 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2f490 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2f4a0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
2f4b0 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
2f4c0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
2f4d0 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
2f4e0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
2f4f0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
2f500 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2f510 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2f520 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
2f530 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
2f540 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2f550 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
2f560 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
2f570 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2f580 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
2f590 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
2f5a0 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
2f5b0 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
2f5c0 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
2f5d0 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
2f5e0 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
2f5f0 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
2f600 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
2f610 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
2f620 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
2f630 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
2f640 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
2f650 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
2f660 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
2f670 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
2f680 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
2f690 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
2f6a0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2f6b0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
2f6c0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2f6d0 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
2f6e0 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
2f6f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
2f700 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
2f710 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
2f720 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
2f730 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
2f740 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2f750 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
2f760 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2f770 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
2f780 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
2f790 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
2f7a0 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
2f7b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
2f7c0 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
2f7d0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2f7e0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2f7f0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2f800 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
2f810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f820 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f830 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
2f840 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2f850 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
2f860 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2f870 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2f880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2f890 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2f8a0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2f8b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f8c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2f8d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
2f8e0 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2f8f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2f900 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2f910 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
2f920 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2f930 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2f940 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2f950 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2f960 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2f970 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2f980 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
2f990 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f9a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2f9b0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2f9c0 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
2f9d0 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
2f9e0 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
2f9f0 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
2fa00 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
2fa10 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
2fa20 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
2fa30 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
2fa40 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
2fa50 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
2fa60 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
2fa70 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
2fa80 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
2fa90 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
2faa0 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
2fab0 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
2fac0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
2fad0 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
2fae0 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
2faf0 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
2fb00 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
2fb10 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
2fb20 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
2fb30 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
2fb40 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
2fb50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
2fb60 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
2fb70 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
2fb80 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
2fb90 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61  age.aOvfl[] arra
2fba0 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
2fbb0 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
2fbc0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
2fbd0 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
2fbe0 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
2fbf0 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
2fc00 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
2fc10 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
2fc20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2fc30 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
2fc40 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
2fc50 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
2fc60 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
2fc70 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
2fc80 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
2fc90 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
2fca0 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
2fcb0 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
2fcc0 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
2fcd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2fce0 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
2fcf0 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2fd00 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
2fd10 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2fd20 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2fd30 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
2fd40 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
2fd50 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
2fd60 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
2fd70 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
2fd80 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
2fd90 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
2fda0 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
2fdb0 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
2fdc0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
2fdd0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
2fde0 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
2fdf0 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
2fe00 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
2fe10 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
2fe20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
2fe30 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
2fe40 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2fe50 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2fe60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
2fe70 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2fe80 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
2fe90 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
2fea0 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
2feb0 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
2fec0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
2fed0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
2fee0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
2fef0 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2ff00 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2ff10 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
2ff20 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2ff30 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2ff40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2ff50 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
2ff60 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
2ff70 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
2ff80 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
2ff90 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
2ffa0 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
2ffb0 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2ffc0 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2ffd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2ffe0 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2fff0 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
30000 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
30010 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
30020 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
30030 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
30040 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
30050 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
30060 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
30070 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
30080 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
30090 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
300a0 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
300b0 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
300c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
300d0 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
300e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
300f0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
30100 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
30110 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
30120 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
30130 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
30140 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
30150 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
30160 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
30170 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
30180 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
30190 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
301a0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
301b0 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
301c0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
301d0 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
301e0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
301f0 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
30200 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
30210 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
30220 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
30230 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
30240 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
30250 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
30260 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
30270 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
30280 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
30290 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
302a0 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
302b0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
302c0 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
302d0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
302e0 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
302f0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
30300 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
30310 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
30320 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
30330 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
30340 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
30350 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
30360 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
30370 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
30380 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
30390 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
303a0 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
303b0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
303c0 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
303d0 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
303e0 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
303f0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
30400 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
30410 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
30420 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
30430 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
30440 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
30450 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
30460 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
30470 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
30480 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
30490 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
304a0 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
304b0 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
304c0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
304d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
304e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
304f0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
30500 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
30510 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
30520 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
30530 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
30540 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
30550 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
30560 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
30570 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
30580 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
30590 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
305a0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
305b0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
305c0 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
305d0 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
305e0 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
305f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
30600 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
30610 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
30620 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
30630 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
30640 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
30650 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
30660 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
30670 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
30680 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
30690 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
306a0 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
306b0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
306c0 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
306d0 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
306e0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
306f0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
30700 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
30710 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
30720 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
30730 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
30740 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
30750 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
30760 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
30770 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
30780 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
30790 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
307a0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
307b0 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
307c0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
307d0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
307e0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
307f0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
30800 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
30810 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
30820 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
30830 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
30840 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
30850 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
30860 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
30870 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
30880 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
30890 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
308a0 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
308b0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
308c0 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
308d0 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
308e0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
308f0 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
30900 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
30910 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
30920 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
30930 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
30940 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
30950 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
30960 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
30970 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
30980 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
30990 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
309a0 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
309b0 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
309c0 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
309d0 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
309e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
309f0 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
30a00 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
30a10 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
30a20 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
30a30 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
30a40 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
30a50 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
30a60 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
30a70 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
30a80 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
30a90 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
30aa0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
30ab0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
30ac0 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
30ad0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
30ae0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
30af0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
30b00 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
30b10 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
30b20 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
30b30 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
30b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
30b50 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
30b60 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
30b70 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
30b80 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  sRoot           
30b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30ba0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
30bb0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
30bc0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
30bd0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
30be0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
30bf0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
30c00 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
30c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30c20 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
30c30 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
30c40 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
30c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
30c60 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
30c70 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
30c80 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
30c90 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
30ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30cb0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
30cc0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
30cd0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
30ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30cf0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
30d00 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
30d10 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
30d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30d30 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
30d40 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
30d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30d60 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
30d70 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
30d80 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
30d90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30da0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
30db0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
30dc0 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
30dd0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
30de0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
30df0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
30e00 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
30e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30e20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
30e30 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
30e40 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
30e50 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
30e60 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
30e70 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
30e80 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
30e90 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
30ea0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
30eb0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
30ec0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
30ed0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
30ee0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
30ef0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
30f00 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
30f10 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
30f20 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
30f30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30f40 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
30f50 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
30f60 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
30f70 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
30f80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
30f90 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
30fa0 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
30fb0 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30fd0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
30fe0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
30ff0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
31000 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
31010 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
31020 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
31030 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
31040 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
31050 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
31060 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
31070 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
31080 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
31090 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
310a0 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
310b0 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
310c0 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
310d0 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
310e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
310f0 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
31100 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
31110 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
31120 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
31130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
31140 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
31150 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
31160 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
31170 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
31180 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
31190 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
311a0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
311b0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
311c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
311d0 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
311e0 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
311f0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
31200 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
31210 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
31220 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
31230 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
31240 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
31250 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
31260 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
31270 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
31280 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
31290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
312a0 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
312b0 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
312c0 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
312d0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
312e0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
312f0 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
31300 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
31310 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
31320 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
31330 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
31340 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
31350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31360 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31370 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
31380 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
31390 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
313a0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
313b0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
313c0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
313d0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
313e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
313f0 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
31400 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
31410 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
31420 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
31430 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
31440 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
31450 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
31460 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
31470 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
31480 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
31490 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
314a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
314b0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
314c0 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
314d0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
314e0 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
314f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
31500 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
31510 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
31520 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
31530 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31540 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
31550 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
31560 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
31570 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
31580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
31590 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
315a0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
315b0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
315c0 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
315d0 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
315e0 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
315f0 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
31600 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
31610 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
31620 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
31630 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
31640 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
31650 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
31660 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
31670 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
31680 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
31690 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
316a0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
316b0 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
316c0 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
316d0 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
316e0 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
316f0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
31700 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
31710 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
31720 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
31730 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
31740 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
31750 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
31760 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
31770 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
31780 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
31790 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
317a0 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
317b0 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
317c0 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
317d0 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
317e0 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
317f0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
31800 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
31810 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
31820 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
31830 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
31840 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
31850 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
31860 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
31870 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
31880 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
31890 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
318a0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
318b0 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
318c0 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
318d0 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
318e0 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
318f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
31900 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
31910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
31920 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
31930 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
31940 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
31950 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
31960 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
31970 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
31980 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
31990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
319a0 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
319b0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
319c0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
319d0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
319e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
319f0 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
31a00 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
31a10 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
31a20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
31a30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
31a40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
31a50 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
31a60 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
31a70 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
31a80 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31a90 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  }.    nMaxCells 
31aa0 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
31ab0 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
31ac0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
31ad0 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (i--)==0 ) bre
31ae0 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e  ak;..    if( i+n
31af0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
31b00 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70  Ovfl[0].idx && p
31b10 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31b20 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
31b30 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
31b40 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
31b50 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
31b60 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
31b70 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
31b80 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
31b90 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
31ba0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
31bb0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
31bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31bd0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
31be0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
31bf0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
31c00 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
31c10 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31c20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
31c30 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
31c40 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
31c50 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
31c60 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
31c70 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
31c80 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
31c90 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
31ca0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
31cb0 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
31cc0 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
31cd0 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
31ce0 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
31cf0 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
31d00 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
31d10 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
31d20 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
31d30 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
31d40 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
31d50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
31d60 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
31d70 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
31d80 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
31d90 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
31da0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
31db0 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
31dc0 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
31dd0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
31de0 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77   ** But not if w
31df0 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d  e are in secure-
31e00 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
31e10 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
31e20 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  de,.      ** the
31e30 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
31e40 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
31e50 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
31e60 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
31e70 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
31e80 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
31e90 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
31ea0 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
31eb0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
31ec0 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
31ed0 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
31ee0 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
31ef0 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
31f00 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
31f10 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
31f20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63      if( pBt->sec
31f30 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
31f40 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a       int iOff;..
31f50 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53          iOff = S
31f60 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
31f70 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
31f80 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
31f90 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
31fa0 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
31fb0 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
31fc0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31fe0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31ff0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
32000 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
32010 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
32020 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
32030 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
32040 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
32050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32060 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
32070 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
32080 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
32090 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
320a0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
320b0 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
320c0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
320d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
320e0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
320f0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
32100 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
32110 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
32120 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
32130 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
32140 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
32150 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
32160 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
32170 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
32180 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
32190 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
321a0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
321b0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
321c0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
321d0 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
321e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
321f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
32200 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
32210 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
32220 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
32230 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
32240 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
32250 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
32260 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
32270 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
32280 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
32290 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
322a0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322c0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
322d0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
322e0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
32310 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
32320 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
32330 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
32340 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
32350 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
32360 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
32370 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
32380 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
32390 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
323a0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
323b0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
323c0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
323d0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
323e0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
323f0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
32400 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
32410 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
32420 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
32430 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
32440 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
32450 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
32460 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
32470 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
32480 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
32490 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
324a0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
324b0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
324c0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
324d0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
324e0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
324f0 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
32500 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
32510 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
32520 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
32530 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
32540 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
32550 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
32560 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
32570 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
32580 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
32590 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
325a0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
325b0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
325c0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
325d0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
325e0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
325f0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
32600 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
32610 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
32620 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
32630 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
32640 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
32650 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
32660 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
32670 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
32680 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
32690 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
326a0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
326b0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
326c0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
326d0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
326e0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
326f0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
32700 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
32710 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
32720 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
32730 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
32740 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
32750 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
32760 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
32770 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
32780 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
32790 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
327a0 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
327b0 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
327c0 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
327d0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
327e0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
327f0 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
32800 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
32810 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
32820 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
32830 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
32840 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
32850 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
32860 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
32870 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
32880 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
32890 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
328a0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
328b0 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
328c0 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
328d0 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
328e0 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
328f0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
32900 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
32910 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
32920 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
32930 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
32940 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
32950 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
32960 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
32970 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32980 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e  .    if( pOld->n
32990 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
329a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
329b0 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
329c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
329d0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
329e0 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
329f0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
32a00 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
32a10 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
32a20 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
32a30 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
32a40 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
32a50 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
32a60 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
32a70 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20        u8 *aData 
32a80 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  = pOld->aData;. 
32a90 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67       u16 maskPag
32aa0 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61  e = pOld->maskPa
32ab0 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65  ge;.      u16 ce
32ac0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d  llOffset = pOld-
32ad0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
32ae0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
32af0 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
32b00 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
32b10 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32b20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
32b30 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32  ll] = findCellv2
32b40 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65  (aData, maskPage
32b50 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29  , cellOffset, j)
32b60 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
32b70 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
32b80 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
32b90 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
32ba0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
32bb0 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20     }.    }      
32bc0 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64   .    if( i<nOld
32bd0 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29  -1 && !leafData)
32be0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
32bf0 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a   (u16)szNew[i];.
32c00 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
32c10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
32c20 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
32c30 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
32c40 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
32c50 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
32c60 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
32c70 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
32c80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32c90 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  sz<=pBt->maxLoca
32ca0 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73  l+23 );.      as
32cb0 73 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d  sert( iSpace1 <=
32cc0 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53   (int)pBt->pageS
32cd0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ize );.      mem
32ce0 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
32cf0 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
32d00 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
32d10 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
32d20 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  tion;.      asse
32d30 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
32d40 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
32d50 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
32d60 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
32d70 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  ] = szCell[nCell
32d80 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] - leafCorrecti
32d90 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  on;.      if( !p
32da0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
32db0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32dc0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
32dd0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32de0 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  ( pOld->hdrOffse
32df0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
32e00 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
32e10 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
32e20 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
32e30 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
32e40 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
32e50 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
32e60 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ell */.        m
32e70 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
32e80 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
32e90 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[8], 4);.      
32ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
32eb0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
32ec0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
32ed0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
32ee0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
32ef0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
32f00 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
32f10 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
32f20 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
32f30 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
32f40 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
32f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
32f60 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll++;.    }.  }.
32f70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
32f80 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
32f90 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
32fa0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
32fb0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
32fc0 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
32fd0 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
32fe0 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
32ff0 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
33000 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
33010 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
33020 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
33030 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
33040 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
33050 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
33060 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
33070 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
33080 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
33090 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
330a0 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
330b0 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
330c0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
330d0 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
330e0 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
330f0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
33100 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
33110 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
33120 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
33130 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
33140 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
33150 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
33160 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
33170 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
33180 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
33190 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
331a0 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
331b0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
331c0 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
331d0 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
331e0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
331f0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
33200 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
33210 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
33220 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
33230 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
33240 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
33250 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
33260 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
33270 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
33280 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
33290 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
332a0 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
332b0 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
332c0 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
332d0 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
332e0 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
332f0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
33300 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
33310 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
33320 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
33330 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
33340 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    k++;.      if(
33350 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20   k>NB+1 ){ rc = 
33360 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33370 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63  KPT; goto balanc
33380 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20  e_cleanup; }.   
33390 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
333a0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
333b0 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
333c0 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
333d0 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
333e0 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
333f0 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
33400 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
33410 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
33420 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
33430 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
33440 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
33450 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
33460 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
33470 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
33480 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
33490 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
334a0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
334b0 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
334c0 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
334d0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
334e0 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
334f0 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
33500 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
33510 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
33520 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
33530 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
33540 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
33550 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
33560 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
33570 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
33580 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
33590 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
335a0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
335b0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
335c0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
335d0 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
335e0 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
335f0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
33600 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
33610 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
33620 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
33630 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
33640 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
33650 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
33660 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
33670 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
33680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33690 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
336a0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
336b0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
336c0 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
336d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
336e0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
336f0 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
33700 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
33710 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
33720 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
33730 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
33740 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
33750 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
33760 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
33770 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
33780 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
33790 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
337a0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
337b0 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
337c0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
337d0 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
337e0 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
337f0 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
33800 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
33810 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
33820 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
33830 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
33840 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
33850 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
33860 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
33870 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
33880 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
33890 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
338a0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
338b0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
338c0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
338d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
338e0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
338f0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
33900 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
33910 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
33920 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
33930 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
33940 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
33950 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
33960 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
33970 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
33980 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
33990 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
339a0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
339b0 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30    ",.    apOld[0
339c0 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f  ]->pgno, .    nO
339d0 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d  ld>=2 ? apOld[1]
339e0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20  ->pgno : 0,.    
339f0 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b  nOld>=3 ? apOld[
33a00 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29  2]->pgno : 0.  )
33a10 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
33a20 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
33a30 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
33a40 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
33a50 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
33a60 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d  apOld[0]->pgno<=
33a70 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
33a80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33a90 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  T;.    goto bala
33aa0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
33ab0 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61  .  pageFlags = a
33ac0 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30  pOld[0]->aData[0
33ad0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
33ae0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
33af0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
33b00 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
33b10 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
33b20 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
33b30 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
33b40 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   0;.      rc = b
33b50 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69 74  treeMakePageWrit
33b60 65 61 62 6c 65 28 70 4e 65 77 29 3b 0a 20 20 20  eable(pNew);.   
33b70 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
33b80 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
33b90 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
33ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33bb0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
33bc0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
33bd0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
33be0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
33bf0 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
33c00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
33c10 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
33c20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
33c30 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
33c40 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
33c50 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
33c60 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
33c70 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
33c80 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
33c90 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
33ca0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
33cb0 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
33cc0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33cd0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
33ce0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
33cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33d00 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
33d10 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
33d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33d30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
33d40 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
33d50 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
33d60 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
33d70 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
33d80 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
33d90 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  {.    freePage(a
33da0 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  pOld[i], &rc);. 
33db0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
33dc0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
33dd0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
33de0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
33df0 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
33e00 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
33e10 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
33e20 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
33e30 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
33e40 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
33e50 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
33e60 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
33e70 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
33e80 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
33e90 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
33ea0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
33eb0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
33ec0 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
33ed0 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
33ee0 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
33ef0 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
33f00 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
33f10 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
33f20 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
33f30 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
33f40 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
33f50 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
33f60 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
33f70 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
33f80 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
33f90 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
33fa0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
33fb0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
33fc0 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
33fd0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
33fe0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
33ff0 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
34000 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
34010 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
34020 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
34030 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
34040 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
34050 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
34060 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
34070 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
34080 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
34090 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
340a0 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
340b0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
340c0 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
340d0 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
340e0 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
340f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
34100 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
34110 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
34120 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
34130 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  [i];.      apNew
34140 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
34150 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  ];.      apNew[m
34160 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
34170 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e  .  }.  TRACE(("n
34180 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
34190 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
341a0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61  %d(%d)\n",.    a
341b0 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73  pNew[0]->pgno, s
341c0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
341d0 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d  w>=2 ? apNew[1]-
341e0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
341f0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
34200 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
34210 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20   apNew[2]->pgno 
34220 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
34230 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
34240 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77   nNew>=4 ? apNew
34250 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [3]->pgno : 0, n
34260 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
34270 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
34280 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70  =5 ? apNew[4]->p
34290 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  gno : 0, nNew>=5
342a0 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
342b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
342c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
342d0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
342e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74  DbPage) );.  put
342f0 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70  4byte(pRight, ap
34300 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
34310 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  o);..  /*.  ** E
34320 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
34330 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
34340 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
34350 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
34360 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
34370 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
34380 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
34390 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
343a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
343b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
343c0 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
343d0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
343e0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
343f0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
34400 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
34410 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65  xCells );.    ze
34420 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
34430 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
34440 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
34450 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
34460 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
34470 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
34480 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
34490 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
344a0 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
344b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
344c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
344d0 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  ;..    j = cntNe
344e0 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
344f0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
34500 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
34510 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
34520 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
34530 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
34540 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
34550 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
34560 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
34570 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31  assert( i<nNew-1
34580 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a   || j==nCell );.
34590 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20      if( j<nCell 
345a0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
345b0 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
345c0 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
345d0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
345e0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
345f0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
34600 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
34610 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
34620 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
34630 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
34640 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
34650 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
34660 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
34670 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
34680 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
34690 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
346a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
346b0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
346c0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
346d0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
346e0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
346f0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
34700 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
34710 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
34720 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
34730 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
34740 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
34750 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
34760 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
34770 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
34780 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
34790 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
347a0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
347b0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
347c0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
347d0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
347e0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
347f0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62    j--;.        b
34800 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
34810 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
34820 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
34830 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
34840 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
34850 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
34860 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
34870 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
34880 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
34890 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
348a0 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
348b0 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
348c0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
348d0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
348e0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
348f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
34900 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
34910 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
34920 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
34930 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
34940 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
34950 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
34960 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
34970 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
34980 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73  * (see btreePars
34990 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
349a0 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
349b0 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
349c0 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
349d0 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
349e0 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
349f0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
34a00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
34a10 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
34a20 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
34a30 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
34a40 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
34a50 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
34a60 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
34a70 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
34a80 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
34a90 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
34aa0 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
34ab0 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
34ac0 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
34ad0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
34ae0 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
34af0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
34b00 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
34b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34b20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
34b30 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
34b40 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
34b50 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
34b60 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
34b70 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
34b80 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
34b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
34ba0 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
34bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
34bc0 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
34bd0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
34be0 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c  rt( iOvflSpace <
34bf0 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65  = (int)pBt->page
34c00 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e  Size );.      in
34c10 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
34c20 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
34c30 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d  sz, pTemp, pNew-
34c40 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
34c50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34c60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
34c70 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
34c80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
34c90 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34ca0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
34cb0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a  age) );..      j
34cc0 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
34cd0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
34ce0 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
34cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
34d00 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
34d10 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
34d20 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
34d30 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
34d40 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26    u8 *zChild = &
34d50 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
34d60 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65  aData[8];.    me
34d70 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
34d80 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a  -1]->aData[8], z
34d90 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a  Child, 4);.  }..
34da0 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20    if( isRoot && 
34db0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
34dc0 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64  0 && pParent->hd
34dd0 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30  rOffset<=apNew[0
34de0 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  ]->nFree ){.    
34df0 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
34e00 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
34e10 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ow contains no c
34e20 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73  ells. The only s
34e30 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61  ibling.    ** pa
34e40 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ge is the right-
34e50 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72  child of the par
34e60 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  ent. Copy the co
34e70 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
34e80 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20    ** child page 
34e90 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c  into the parent,
34ea0 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20   decreasing the 
34eb0 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f  overall height o
34ec0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74  f the.    ** b-t
34ed0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79  ree structure by
34ee0 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65   one. This is de
34ef0 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22  scribed as the "
34f00 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65  balance-shallowe
34f10 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c  r".    ** sub-al
34f20 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20  gorithm in some 
34f30 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20  documentation.. 
34f40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
34f50 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
34f60 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
34f70 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70   the call to cop
34f80 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a  yNodeContent() .
34f90 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20      ** sets all 
34fa0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
34fb0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
34fc0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d  g to database im
34fd0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
34fe0 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
34ff0 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65  pointer is store
35000 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e  d within the con
35010 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65  tent being copie
35020 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
35030 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65   The second asse
35040 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  rt below verifie
35050 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64  s that the child
35060 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d   page is defragm
35070 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74  ented.    ** (it
35080 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20   must be, as it 
35090 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74  was just reconst
350a0 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73  ructed using ass
350b0 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68  emblePage()). Th
350c0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70  is.    ** is imp
350d0 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61  ortant if the pa
350e0 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e  rent page happen
350f0 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f  s to be page 1 o
35100 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
35110 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f     ** image.  */
35120 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65  .    assert( nNe
35130 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  w==1 );.    asse
35140 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  rt( apNew[0]->nF
35150 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20  ree == .        
35160 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77  (get2byte(&apNew
35170 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61  [0]->aData[5])-a
35180 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66  pNew[0]->cellOff
35190 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43  set-apNew[0]->nC
351a0 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20  ell*2) .    );. 
351b0 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
351c0 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61  nt(apNew[0], pPa
351d0 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  rent, &rc);.    
351e0 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30  freePage(apNew[0
351f0 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65  ], &rc);.  }else
35200 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
35210 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20  M ){.    /* Fix 
35220 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
35230 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
35240 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77  the cells that w
35250 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f 75  ere shifted arou
35260 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72  nd. .    ** Ther
35270 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64 69  e are several di
35280 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
35290 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
352a0 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ries that need t
352b0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  o.    ** be deal
352c0 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72  t with by this r
352d0 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20  outine. Some of 
352e0 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20  these have been 
352f0 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74  set already, but
35300 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76  .    ** many hav
35310 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  e not. The follo
35320 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72  wing is a summar
35330 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y:.    **.    **
35340 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69 65     1) The entrie
35350 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
35360 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  h new sibling pa
35370 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
35380 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69  t.    **      si
35390 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73  blings when this
353a0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
353b0 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76 65  lled. These have
353c0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
353d0 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
353e0 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
353f0 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
35400 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
35410 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d  re.    **      m
35420 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
35430 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65 65  -list - the free
35440 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73 20  Page() code has 
35450 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a  taken care.    *
35460 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e  *      of those.
35470 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
35480 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d   2) The pointer-
35490 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
354a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
354b0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20  first overflow. 
354c0 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20     **      page 
354d0 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  in any overflow 
354e0 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e  chains used by n
354f0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ew divider cells
35500 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20  . These .    ** 
35510 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61       have also a
35520 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65  lready been take
35530 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68 65  n care of by the
35540 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f   insertCell() co
35550 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
35560 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
35570 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
35580 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
35590 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
355a0 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   of.    **      
355b0 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  cells stored on 
355c0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
355d0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
355e0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
355f0 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20  .    **   4) If 
35600 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
35610 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e  s are not intern
35620 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c  al intkey nodes,
35630 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a   then any.    **
35640 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
35650 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ages used by the
35660 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65  se cells may nee
35670 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a  d to be updated.
35680 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74      **      (int
35690 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
356a0 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  es never contain
356b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65   pointers to ove
356c0 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20  rflow pages)..  
356d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29    **.    **   5)
356e0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
356f0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
35700 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70  aves, then the p
35710 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
35720 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
35730 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
35740 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
35750 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
35760 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f  d.    **      to
35770 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
35780 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73   **.    ** Cases
35790 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61   1 and 2 are dea
357a0 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79  lt with above by
357b0 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65   other code. The
357c0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
357d0 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 61  ck deals with ca
357e0 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20  ses 3 and 4 and 
357f0 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68  the one after th
35800 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63  at, case 5. Sinc
35810 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  e.    ** setting
35820 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65   a pointer map e
35830 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74 69  ntry is a relati
35840 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f  vely expensive o
35850 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20  peration, this. 
35860 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20     ** code only 
35870 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70  sets pointer map
35880 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69   entries for chi
35890 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
358a0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
358b0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d     ** actually m
358c0 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61 67  oved between pag
358d0 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  es.  */.    MemP
358e0 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
358f0 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67  w[0];.    MemPag
35900 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
35910 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76  [0];.    int nOv
35920 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
35930 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
35940 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c  t iNextOld = pOl
35950 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72  d->nCell + nOver
35960 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f  flow;.    int iO
35970 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72  verflow = (nOver
35980 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76  flow ? pOld->aOv
35990 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b  fl[0].idx : -1);
359a0 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20  .    j = 0;     
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
359d0 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67  nt 'old' sibling
359e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d   page */.    k =
359f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27  /* Current 'new'
35a20 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
35a30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
35a40 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
35a50 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72     int isDivider
35a60 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
35a70 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29  e( i==iNextOld )
35a80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
35a90 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
35aa0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
35ab0 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
35ac0 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20  ell on old.     
35ad0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
35ae0 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62  ge j. If the sib
35af0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
35b00 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
35b10 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
35b20 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
35b30 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64  ll i was a divid
35b40 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  er cell. */.    
35b50 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20      assert( j+1 
35b60 3c 20 41 72 72 61 79 53 69 7a 65 28 61 70 43 6f  < ArraySize(apCo
35b70 70 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  py) );.        p
35b80 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
35b90 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
35ba0 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
35bb0 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
35bc0 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
35bd0 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
35be0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
35bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
35c00 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
35c10 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
35c20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
35c30 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
35c40 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
35c50 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
35c60 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
35c70 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
35c80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
35c90 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
35ca0 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
35cb0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
35cc0 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
35cd0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
35ce0 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
35cf0 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
35d00 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
35d10 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
35d20 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
35d30 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
35d40 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
35d50 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
35d60 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
35d70 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
35d80 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
35d90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
35da0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
35db0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
35dc0 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
35dd0 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
35de0 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
35df0 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
35e00 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
35e10 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
35e20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
35e30 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
35e40 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
35e50 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
35e60 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
35e70 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
35e80 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
35e90 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
35ea0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
35eb0 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
35ec0 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
35ed0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35ee0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
35ef0 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20  t( j<nOld );.   
35f00 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65     assert( k<nNe
35f10 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w );..      /* I
35f20 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f  f the cell was o
35f30 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65  riginally divide
35f40 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e  r cell (and is n
35f50 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20  ot now) or.     
35f60 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   ** an overflow 
35f70 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  cell, or if the 
35f80 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64  cell was located
35f90 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
35fa0 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  sibling.      **
35fb0 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
35fc0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e   balancing, then
35fd0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
35fe0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
35ff0 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ted.      ** wit
36000 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f  h any child or o
36010 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65  verflow pages ne
36020 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
36030 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
36040 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c  isDivider || pOl
36050 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  d->pgno!=pNew->p
36060 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
36070 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
36080 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
36090 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
360a0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
360b0 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
360c0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
360d0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
360e0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
360f0 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  [i]>pNew->minLoc
36100 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
36110 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
36120 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
36130 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
36140 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
36150 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
36160 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
36170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
36180 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
36190 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62   u32 key = get4b
361a0 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
361b0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
361c0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
361d0 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52   key, PTRMAP_BTR
361e0 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
361f0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
36200 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
36210 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
36220 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
36230 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
36240 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
36250 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
36260 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
36270 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
36280 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
36290 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
362a0 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
362b0 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
362c0 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
362d0 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
362e0 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
362f0 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
36300 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
36310 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
36320 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
36330 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
36340 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
36350 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
36360 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
36370 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
36380 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
36390 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
363a0 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
363b0 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
363c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
363d0 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
363e0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
363f0 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
36400 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
36410 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
36420 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
36430 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
36440 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
36450 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
36460 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
36470 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
36480 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
36490 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
364a0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
364b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
364c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
364d0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
364e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
364f0 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
36500 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
36510 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
36520 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
36530 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
36540 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
36550 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
36560 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
36570 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
36580 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
36590 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
365a0 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
365b0 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
365c0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
365d0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
365e0 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
365f0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
36600 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
36610 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
36620 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
36630 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
36640 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
36650 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
36660 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
36670 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
36680 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
36690 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
366a0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
366b0 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
366c0 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
366d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
366e0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
366f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
36700 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
36710 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
36720 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
36730 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
36740 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
36750 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
36760 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
36770 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
36780 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
36790 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
367a0 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
367b0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
367c0 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
367d0 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
367e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
367f0 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
36800 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
36810 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
36820 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
36830 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
36840 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
36850 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
36860 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
36870 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
36880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36890 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
368a0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
368b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
368c0 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
368d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
368e0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
368f0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
36900 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20  noChild = 0;    
36910 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36920 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
36930 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
36940 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
36950 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
36960 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
36970 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
36980 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
36990 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
369a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
369b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
369c0 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
369d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
369e0 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
369f0 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
36a00 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
36a10 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
36a20 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
36a30 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
36a40 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
36a50 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
36a60 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
36a70 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
36a80 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
36a90 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b  .  rc = btreeMak
36aa0 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70  ePageWriteable(p
36ab0 52 6f 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Root);.  if( rc=
36ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36ad0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
36ae0 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43  treePage(pBt,&pC
36af0 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c  hild,&pgnoChild,
36b00 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a  pRoot->pgno,0);.
36b10 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
36b20 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  ent(pRoot, pChil
36b30 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  d, &rc);.    if(
36b40 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
36b50 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
36b60 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  (pBt, pgnoChild,
36b70 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
36b80 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Root->pgno, &rc)
36b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
36ba0 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43  ( rc ){.    *ppC
36bb0 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  hild = 0;.    re
36bc0 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
36bd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
36be0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
36bf0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36c00 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
36c10 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
36c20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
36c30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52  erIswriteable(pR
36c40 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  oot->pDbPage) );
36c50 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
36c60 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d  d->nCell==pRoot-
36c70 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41  >nCell );..  TRA
36c80 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
36c90 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
36ca0 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67  %d\n", pRoot->pg
36cb0 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
36cc0 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74  ));..  /* Copy t
36cd0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
36ce0 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20  s from pRoot to 
36cf0 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63  pChild */.  memc
36d00 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
36d10 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20  , pRoot->aOvfl, 
36d20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
36d30 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61  *sizeof(pRoot->a
36d40 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
36d50 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
36d60 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
36d70 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  w;..  /* Zero th
36d80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52  e contents of pR
36d90 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c  oot. Then instal
36da0 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20  l pChild as the 
36db0 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a  right-child. */.
36dc0 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
36dd0 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
36de0 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b  0] & ~PTF_LEAF);
36df0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f  .  put4byte(&pRo
36e00 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
36e10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
36e20 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70  gnoChild);..  *p
36e30 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b  pChild = pChild;
36e40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
36e50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
36e60 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72  e page that pCur
36e70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
36e80 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65  s to has just be
36e90 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a  en modified in.*
36ea0 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73  * some way. This
36eb0 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65   function figure
36ec0 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f  s out if this mo
36ed0 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73  dification means
36ee0 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65   the.** tree nee
36ef0 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
36f00 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c  d, and if so cal
36f10 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ls the appropria
36f20 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a  te balancing .**
36f30 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63   routine. Balanc
36f40 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
36f50 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  :.**.**   balanc
36f60 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62  e_quick().**   b
36f70 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a  alance_deeper().
36f80 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  **   balance_non
36f90 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63  root().*/.static
36fa0 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
36fb0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
36fc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36fd0 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  OK;.  const int 
36fe0 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74  nMin = pCur->pBt
36ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32  ->usableSize * 2
37000 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61   / 3;.  u8 aBala
37010 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33  nceQuickSpace[13
37020 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  ];.  u8 *pFree =
37030 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28   0;..  TESTONLY(
37040 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
37050 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  ck_called = 0 );
37060 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
37070 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f   balance_deeper_
37080 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20  called = 0 );.. 
37090 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50   do {.    int iP
370a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
370b0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
370c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
370d0 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20  Page[iPage];..  
370e0 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
370f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
37100 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
37110 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
37120 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
37130 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75  b-tree is overfu
37140 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
37150 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20   call the.      
37160 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65    ** balance_dee
37170 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  per() function t
37180 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63  o create a new c
37190 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  hild for the roo
371a0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
371b0 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63  * and copy the c
371c0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
371d0 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
371e0 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20   to it. The.    
371f0 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72      ** next iter
37200 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
37210 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
37220 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  e the child page
37230 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20  ..        */ .  
37240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
37250 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
37260 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
37270 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
37280 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c  ce_deeper(pPage,
37290 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31   &pCur->apPage[1
372a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
372b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
372c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
372d0 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  >iPage = 1;.    
372e0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
372f0 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[0] = 0;.      
37300 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
37310 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
37320 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
37330 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72  apPage[1]->nOver
37340 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20  flow );.        
37350 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
37360 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
37370 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
37380 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
37390 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
373a0 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b  ->nFree<=nMin ){
373b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
373c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
373d0 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70  emPage * const p
373e0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
373f0 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a  pPage[iPage-1];.
37400 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20        int const 
37410 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  iIdx = pCur->aiI
37420 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20  dx[iPage-1];..  
37430 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61      rc = btreeMa
37440 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28  kePageWriteable(
37450 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
37460 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37470 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
37480 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
37490 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
374a0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
374b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
374c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
374d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
374e0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
374f0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
37500 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
37510 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
37520 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
37530 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
37540 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
37550 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
37560 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
37570 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
37580 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
37590 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
375a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
375b0 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
375c0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
375d0 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
375e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
375f0 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
37600 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
37610 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
37620 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
37630 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
37640 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
37650 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
37660 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
37670 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
37680 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
37690 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
376a0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
376b0 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
376c0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
376d0 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
376e0 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
376f0 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
37700 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
37710 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
37720 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
37730 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
37740 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
37750 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
37760 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
37770 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
37780 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
37790 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
377a0 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
377b0 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
377c0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
377d0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
377e0 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
377f0 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
37800 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
37810 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
37820 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
37830 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
37840 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
37850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37860 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
37870 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
37880 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
37890 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
378a0 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
378b0 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
378c0 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
378d0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
378e0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
378f0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
37900 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
37910 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
37920 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
37930 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
37940 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
37950 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
37960 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
37970 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
37980 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
37990 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
379a0 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
379b0 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
379c0 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
379d0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
379e0 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
379f0 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
37a00 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
37a10 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
37a20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
37a30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
37a40 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
37a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
37a60 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
37a70 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
37a80 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
37a90 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
37aa0 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
37ab0 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
37ac0 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
37ad0 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
37ae0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
37af0 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
37b00 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
37b10 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
37b20 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
37b30 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
37b40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
37b50 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
37b60 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
37b70 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
37b80 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
37b90 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
37ba0 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
37bb0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
37bc0 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
37bd0 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
37be0 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
37bf0 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
37c00 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
37c10 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
37c20 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
37c30 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
37c40 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
37c50 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
37c60 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
37c70 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
37c80 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
37c90 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
37ca0 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
37cb0 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
37cc0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
37cd0 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
37ce0 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
37cf0 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
37d00 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
37d10 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
37d20 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
37d30 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
37d40 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
37d50 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
37d60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
37d70 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
37d80 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
37d90 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
37da0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
37db0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37dc0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
37dd0 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31  pSpace, iPage==1
37de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
37df0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
37e00 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65        /* If pFre
37e10 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
37e20 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
37e30 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
37e40 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed .            
37e50 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73  ** by a previous
37e60 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
37e70 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20  _nonroot(). Its 
37e80 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20  contents are.   
37e90 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20           ** now 
37ea0 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e  stored either on
37eb0 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70   real database p
37ec0 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74  ages or within t
37ed0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
37ee0 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75  ** new pSpace bu
37ef0 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20  ffer, so it may 
37f00 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20  be safely freed 
37f10 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
37f20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
37f30 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
37f40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
37f50 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63      /* The pSpac
37f60 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  e buffer will be
37f70 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65   freed after the
37f80 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20   next call to.  
37f90 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
37fa0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72  ce_nonroot(), or
37fb0 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69   just before thi
37fc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
37fd0 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20  ns, whichever.  
37fe0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73          ** comes
37ff0 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20   first. */.     
38000 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70       pFree = pSp
38010 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ace;.        }. 
38020 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
38030 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
38040 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
38050 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
38060 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
38070 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
38080 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
38090 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
380a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
380b0 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
380c0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
380d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
380e0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
380f0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
38100 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
38110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
38120 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
38130 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
38140 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
38150 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
38160 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
38170 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
38180 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
38190 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
381a0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
381b0 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
381c0 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
381d0 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
381e0 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
381f0 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
38200 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
38210 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
38220 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
38230 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
38240 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
38250 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
38260 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
38270 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
38280 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
38290 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
382a0 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
382b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
382c0 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
382d0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
382e0 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73  o, then a succes
382f0 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  sful call to.** 
38300 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
38310 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
38320 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
38330 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
38340 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
38350 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
38360 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
38370 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20  ult returned (a 
38380 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62  negative.** numb
38390 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  er if pCur point
383a0 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  s at an entry th
383b0 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
383c0 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c  an (pKey, nKey),
383d0 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76   or.** a positiv
383e0 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20  e value if pCur 
383f0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72  points at an etr
38400 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  y that is larger
38410 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c   than .** (pKey,
38420 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20   nKey)). .**.** 
38430 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
38440 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
38450 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
38460 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
38470 65 65 73 20 74 68 61 74 0a 2a 2a 20 63 75 72 73