/ Hex Artifact Content
Login

Artifact cbad71970cfadfa342fc137ca5e319f98b2d0da1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2140: 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21   BTS_EXCLUSIVE)!
2150: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2160: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2170: 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
2180: 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20  Writer->db);.   
2190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
21a0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
21b0: 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49  E;.  }..  for(pI
21c0: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
21d0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
21e0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
21f0: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2200: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
2210: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
2220: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
2230: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
2240: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2250: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a  ation of:.    **
2260: 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b  .    **   (eLock
2270: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20  ==WRITE_LOCK || 
2280: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2290: 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a  ITE_LOCK).    **
22a0: 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65  .    ** since we
22b0: 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c   know that if eL
22c0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c  ock==WRITE_LOCK,
22d0: 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63   then no other c
22e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  onnection.    **
22f0: 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54   may hold a WRIT
2300: 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61  E_LOCK on any ta
2310: 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ble in this file
2320: 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61   (since there ca
2330: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65  n.    ** only be
2340: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
2350: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
2360: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
2370: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2380: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2390: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
23a0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
23b0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
23c0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c  er->pBtree==p ||
23d0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
23e0: 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  EAD_LOCK);.    i
23f0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
2400: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
2410: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49  able==iTab && pI
2420: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
2430: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
2440: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2450: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
2460: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
2470: 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d       if( eLock==
2480: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  WRITE_LOCK ){.  
2490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
24a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  =pBt->pWriter );
24b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74  .        pBt->bt
24c0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45  sFlags |= BTS_PE
24d0: 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20  NDING;.      }. 
24e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24f0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
2500: 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CACHE;.    }.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2520: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2530: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2540: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2560: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2570: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
2580: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
2590: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
25a0: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
25b0: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
25c0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
25d0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
25e0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
25f0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
2600: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
2610: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2620: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66  on assumes the f
2630: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2640: 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66    (a) The specif
2650: 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74  ied Btree object
2660: 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20   p is connected 
2670: 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a  to a sharable.**
2680: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
2690: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
26a0: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20  Shared.sharable 
26b0: 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a  flag set), and.*
26c0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
26d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
26e0: 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68  s hold a lock th
26f0: 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20  at conflicts.** 
2700: 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72        with the r
2710: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69  equested lock (i
2720: 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43  .e. querySharedC
2730: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2740: 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72  has.**       alr
2750: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2760: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51   and returned SQ
2770: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
2780: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2790: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
27a0: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
27b0: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
27c0: 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74  NOMEM .** is ret
27d0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
27e0: 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e  c attempt fails.
27f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2800: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
2810: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
2820: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
2830: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
2840: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2850: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
2860: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
2870: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2880: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2890: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
28a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
28b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
28c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
28d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
28e0: 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db!=0 );..  /* 
28f0: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  A connection wit
2900: 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  h the read-uncom
2910: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20  mitted flag set 
2920: 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74  will never try t
2930: 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20  o.  ** obtain a 
2940: 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20  read-lock using 
2950: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2960: 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63  he only read-loc
2970: 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  k obtained.  ** 
2980: 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  by a connection 
2990: 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  in read-uncommit
29a0: 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74  ted mode is on t
29b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
29c0: 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e   .  ** table, an
29d0: 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f  d that lock is o
29e0: 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65  btained in Btree
29f0: 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a  BeginTrans().  *
2a00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28  /.  assert( 0==(
2a10: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2a20: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2a30: 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  ted) || eLock==W
2a40: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
2a50: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2a60: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a70: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
2a80: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
2a90: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
2aa0: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
2ab0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
2ac0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
2ad0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
2ae0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
2af0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
2b00: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
2b10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b20: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
2b30: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
2b40: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
2b50: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
2b60: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
2b70: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
2b80: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
2b90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2ba0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2bb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
2bc0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2bd0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
2be0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2bf0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
2c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2c20: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
2c30: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
2c40: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
2c50: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
2c60: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
2c70: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
2c80: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
2c90: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
2ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
2cb0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2cc0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
2cd0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
2ce0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
2cf0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
2d00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d20: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
2d30: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
2d40: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
2d50: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
2d60: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
2d70: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
2d80: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
2d90: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
2da0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
2db0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
2dc0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
2dd0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
2de0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2df0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
2e00: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
2e10: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
2e20: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
2e30: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
2e40: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
2e50: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
2e60: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
2e70: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
2e80: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
2e90: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
2ea0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
2eb0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
2ec0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
2ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2ef0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2f00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2f20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2f30: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
2f40: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
2f50: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
2f60: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
2f70: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2f80: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
2f90: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
2fa0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fc0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
2fd0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
2fe0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2ff0: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3000: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3010: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3020: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3030: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3040: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3050: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3060: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3070: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3080: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
3090: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
30a0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
30b0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
30c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
30e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
30f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3100: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3110: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3120: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3130: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3140: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3150: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3160: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3170: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3180: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
3190: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
31a0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
31b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31c0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31d0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31e0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31f0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3200: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3210: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3220: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3230: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3240: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3250: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3260: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3270: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3280: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
32b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
32d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32e0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
32f0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3300: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3310: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3320: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3330: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3340: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3350: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3360: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3370: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3380: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
33b0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
33c0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33e0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33f0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3400: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3410: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3420: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3430: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3450: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3460: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3470: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3480: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3490: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
34a0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
34b0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
34c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
34d0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
34e0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
34f0: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3500: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3510: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3520: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3530: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3540: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3550: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3560: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3590: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
35a0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
35b0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
35c0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
35d0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
35e0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
35f0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3600: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3610: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3620: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3630: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3640: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3650: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3660: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3670: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3680: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3690: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
36a0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
36b0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
36c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
36d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
36e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
36f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3700: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3710: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3720: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3740: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3750: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3760: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3770: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3780: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3790: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
37a0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
37b0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
37c0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
37d0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
37e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
37f0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3800: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3810: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3820: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3830: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3840: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3850: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3870: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3890: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38a0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
38b0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
38c0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
38d0: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
38e0: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
38f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3900: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3910: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
3920: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
3930: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3940: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
3950: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3960: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3970: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3980: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3990: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
39a0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
39b0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
39c0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
39d0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
39e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
39f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3a00: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3a10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3a20: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3a30: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3a60: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3a70: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3a80: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3a90: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3aa0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3ac0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3ad0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3ae0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3af0: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
3b00: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
3b10: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
3b20: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
3b30: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
3b40: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
3b50: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
3b60: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
3b70: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3b80: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
3b90: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
3ba0: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
3bb0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
3bc0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3bd0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
3be0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
3bf0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3c00: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
3c10: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
3c20: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
3c30: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
3c40: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
3c50: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
3c60: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
3c70: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
3c80: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
3c90: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
3ca0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3cb0: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
3cc0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
3cd0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
3ce0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
3cf0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
3d00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
3d10: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
3d20: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3d50: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34  o check */.  i64
3d60: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3d80: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3d90: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3da0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3dd0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3e00: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3e30: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3e40: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3e50: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3e60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3e70: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3e80: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3e90: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3ea0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3eb0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3ec0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3ed0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3ee0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
3ef0: 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  s when INCRBLOB 
3f00: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
3f10: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3f20: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3f30: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3f40: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3f50: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3f60: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3f70: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
3f80: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
3f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3fa0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
3fb0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
3fc0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
3fd0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
3fe0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
3ff0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4000: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4010: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4020: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4030: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4040: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4050: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4060: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4070: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
4080: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
4090: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
40a0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
40b0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
40c0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
40d0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
40e0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
40f0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4100: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4110: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4120: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4130: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4140: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4150: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4160: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4170: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
4180: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
4190: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
41a0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
41b0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
41c0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
41d0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
41e0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
41f0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4200: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4210: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4220: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4230: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4240: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4250: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4260: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4270: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
4280: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4290: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
42a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
42b0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
42c0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
42d0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
42e0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
42f0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4300: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4310: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4320: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4330: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4340: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4350: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4360: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4370: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
4380: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
4390: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43a0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
43b0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
43c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
43d0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
43e0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
43f0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4400: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4410: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4420: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4430: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4440: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4460: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4470: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
4480: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
4490: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
44a0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
44b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
44c0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
44d0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
44e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
44f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4500: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4510: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4520: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4530: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4540: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4550: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4560: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4570: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4580: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
4590: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
45a0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
45b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
45c0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
45d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
45e0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
45f0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4600: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4610: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4620: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4630: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4640: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4650: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4660: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4670: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4680: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4690: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
46a0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
46b0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
46c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
46d0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
46e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
46f0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4700: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4710: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4720: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4740: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4750: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4760: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4770: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
47a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
47b0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
47c0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
47e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
47f0: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4800: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4810: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4820: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4830: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4840: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4850: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4860: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4870: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4880: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4890: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
48a0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
48b0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
48c0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
48d0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
48e0: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
48f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4900: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4910: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4920: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4930: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4940: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4950: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4960: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4970: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4980: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4990: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
49a0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
49b0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
49c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
49d0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
49e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
49f0: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4a00: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a10: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4a20: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4a30: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4a40: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4a50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4a70: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4a80: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4a90: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4aa0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4ab0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4ac0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ad0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4ae0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4af0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4b00: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4b10: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4b20: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4b30: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
4b40: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
4b50: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4b60: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4b70: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4b80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4b90: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4ba0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4bb0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4bc0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4bd0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4bf0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4c00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4c10: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4c20: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4c30: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4c40: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4c50: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4c60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4c70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4c80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4c90: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4ca0: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4cb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4cc0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4cd0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4ce0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4cf0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4d00: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4d10: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4d20: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4d30: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4d40: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4d50: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4d60: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4d70: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4d80: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4d90: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4da0: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4db0: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4dc0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4dd0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4de0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4df0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4e00: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4e10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4e20: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4e30: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4e40: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4e50: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4e60: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4e70: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4e80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4e90: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4ea0: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4eb0: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4ec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4ee0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f10: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4f40: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4f50: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4f60: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4f70: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4f80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4f90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4fa0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4fb0: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4fc0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4fd0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4fe0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4ff0: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
5000: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
5010: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5020: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
5030: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
5040: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
5050: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
5060: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
5070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5080: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5090: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
50a0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
50b0: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
50c0: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
50d0: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
50e0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
50f0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5100: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5110: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5120: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5130: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5140: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5150: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5160: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5170: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5180: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5190: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
51a0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
51b0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
51c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
51d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
51e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
51f0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
5200: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
5210: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
5220: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
5230: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
5240: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
5250: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5260: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5270: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5280: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5290: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
52a0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
52b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
52c0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
52d0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
52e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
52f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
5320: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
5330: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5350: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5360: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5370: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5380: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5390: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
53a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
53b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
53c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
53d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
53e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
53f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
5400: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
5410: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
5420: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
5430: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5440: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5450: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5460: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5470: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5480: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5490: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
54a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
54c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
54d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
54e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
54f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
5500: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
5510: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
5520: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
5530: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5540: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5550: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5560: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5570: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5580: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5590: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
55a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
55b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
55c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
55d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
55e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
55f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
5600: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
5610: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5620: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
5630: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5640: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5650: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5660: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5670: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5680: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5690: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
56a0: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
56b0: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
56c0: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
56d0: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
56e0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
56f0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5700: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
5720: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
5730: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5740: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5750: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5760: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5770: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
57a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
57b0: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
57c0: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
57d0: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
57e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
57f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5800: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5810: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5820: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5830: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
5840: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
5850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5860: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
5870: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
5880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
58a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
58c0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
58d0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
58e0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
58f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5900: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5910: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5920: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5930: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
5940: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
5950: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5960: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
5970: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
5980: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
5990: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59a0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
59b0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
59c0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
59d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
59e0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
59f0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a20: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5a40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5a50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5a60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5a70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5a80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5a90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5aa0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5ab0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5ac0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5ad0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5ae0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5af0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b00: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b30: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5b40: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5b50: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5b60: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5b70: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5b90: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5bb0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5bc0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5bd0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5be0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5bf0: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c00: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c20: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5c40: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5c50: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5c60: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5c70: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5c80: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5c90: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5ca0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5cb0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5cc0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5cd0: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5ce0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d10: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d30: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5d40: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5d50: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5d60: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5d70: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5d80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5da0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5db0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5dc0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5dd0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5de0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5df0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e00: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e10: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e20: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e30: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5e40: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5e50: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5e80: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5ea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5ec0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5ed0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5ee0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5ef0: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f00: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f10: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f20: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f30: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5f40: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5f50: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5f60: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5f70: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5f80: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5f90: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
5fa0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
5fb0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
5fc0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
5fd0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
5fe0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
5ff0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6000: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6010: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6020: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6040: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
6050: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6060: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
6070: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
6080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
60a0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
60b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
60c0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
60d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
60e0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
60f0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6100: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6110: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6120: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6130: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
6140: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
6150: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
6160: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
6170: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
6180: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
6190: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
61a0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
61c0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
61d0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
61e0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
61f0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6200: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6210: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6220: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
6240: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
6250: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
6260: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
6270: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
6280: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
6290: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
62a0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
62b0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
62c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
62d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
62e0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
62f0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6300: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6310: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6320: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
6340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
6360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
6370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
6380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
6390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
63a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
63b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
63c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
63d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
63e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
63f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6400: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6410: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6420: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6430: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
6440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6450: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6460: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
6470: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6480: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
6490: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
64a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
64b0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
64c0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
64d0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
64e0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
64f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6500: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6510: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6520: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6530: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6540: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6550: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
6560: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
6570: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6580: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6590: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
65a0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
65b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
65c0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
65d0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
65e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
65f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6600: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6610: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6620: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6640: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6650: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
6660: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6670: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6680: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
6690: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
66a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
66b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
66c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
66d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
66e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
66f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6700: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6710: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6720: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6730: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
6740: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
6750: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6760: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6790: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
67a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
67b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
67c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
67d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
67e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
67f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6800: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6810: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6820: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6830: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
6850: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
6860: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
6870: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
6880: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
6890: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
68a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
68b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
68c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
68d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
68e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
68f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6900: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6920: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6930: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6940: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
6950: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
6960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6970: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
6980: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6990: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
69a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
69b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
69c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
69d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
69e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
69f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a10: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a20: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a30: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6a50: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6a60: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6a70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6a80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6aa0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6ab0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6ac0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6ad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6ae0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6af0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b00: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b10: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b20: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b30: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6b40: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6b50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6b60: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6b90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6ba0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6bb0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6bd0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6be0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6bf0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c00: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c10: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c20: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c30: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6c40: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6c50: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6c60: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6c80: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6ca0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6cc0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6cd0: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6ce0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6cf0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d00: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d10: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d20: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d30: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6d40: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6d50: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6d60: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6d70: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6d80: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6da0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6db0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6dc0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6dd0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6de0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6df0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e00: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e10: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e20: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e30: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6e40: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6e50: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6e60: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6e70: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
6e80: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
6e90: 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c   findCellv2(D,M,
6ea0: 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62  O,I) (D+(M&get2b
6eb0: 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29  yte(D+(O+2*(I)))
6ec0: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
6ed0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6ee0: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6ef0: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6f00: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6f10: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6f20: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6f30: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6f40: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6f50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6f60: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6f70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6f90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6fa0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
6fb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
6fc0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6fd0: 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70  int k;.    k = p
6fe0: 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b  Page->aiOvfl[i];
6ff0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
7000: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
7010: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
7020: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d     return pPage-
7030: 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >apOvfl[i];.    
7040: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
7050: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
7060: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
7070: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
7080: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
7090: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
70a0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
70b0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
70c0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
70d0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
70e0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
70f0: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
7100: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
7110: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
7120: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7130: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
7140: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
7150: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
7160: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
7170: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
7180: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
7190: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
71a0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
71b0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
71c0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
71d0: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
71e0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
71f0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
7200: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
7210: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
7220: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7230: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7240: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7250: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7260: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7270: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
72a0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
72b0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
72c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
72d0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
72e0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
7310: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
7320: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
7330: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
7340: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7350: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
7360: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
7370: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7380: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7390: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
73a0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
73b0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
73c0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
73d0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
73e0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
73f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7400: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7410: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7420: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7430: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7440: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7450: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
7460: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
7470: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
7480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7490: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
74a0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
74b0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
74c0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
74d0: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
74e0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
74f0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7500: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7510: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7520: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7530: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7540: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7550: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
7560: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
7570: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
7580: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
7590: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
75a0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
75b0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
75c0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
75d0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
75e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
75f0: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7600: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7610: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7620: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7630: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7640: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7650: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
7660: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
7670: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
7680: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
7690: 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d  .    if( (pInfo-
76a0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e  >nSize = (u16)(n
76b0: 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20  +nPayload))<4 ) 
76c0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
76d0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
76e0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
76f0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7700: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
7720: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7730: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7740: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7750: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7760: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7770: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7780: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7790: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
77a0: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
77b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
77c0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
77d0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
77e0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
77f0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
7800: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
7810: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
7820: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7830: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7840: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7850: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7860: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7870: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7880: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7890: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
78a0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
78b0: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
78c0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
78d0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
78e0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
78f0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7900: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
7910: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7920: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7930: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7940: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7950: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7960: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7970: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7980: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7990: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
79a0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
79b0: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
79c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
79d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
79e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
79f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
7a00: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
7a10: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
7a20: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7a30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7a40: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7a50: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7a60: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7a70: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7a80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7a90: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7aa0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7ab0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7ac0: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
7ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ae0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
7af0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
7b00: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
7b10: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
7b20: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7b30: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7b40: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7b50: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7b60: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7b70: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7b80: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7b90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7ba0: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7bb0: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7bc0: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
7bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
7be0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
7bf0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
7c00: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
7c10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
7c20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7c40: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7c50: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7c60: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7c70: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7c80: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7c90: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7ca0: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7cb0: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
7cd0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
7ce0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
7cf0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
7d00: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
7d10: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
7d20: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7d30: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7d40: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7d50: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7d60: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7d70: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7d80: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7d90: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7da0: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7db0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7dc0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7dd0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7de0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7df0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7e00: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7e10: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7e20: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7e30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7e40: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7e50: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7e60: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7e70: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7e80: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7e90: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7ea0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7eb0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7ec0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ed0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7ee0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7ef0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7f00: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7f20: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7f30: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7f40: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7f50: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7f60: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7f70: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7f80: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7f90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7fa0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7fb0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7fc0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7fd0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7fe0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7ff0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
8000: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
8010: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
8020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
8030: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
8040: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
8050: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
8060: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
8070: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
8080: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
8090: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
80a0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
80b0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
80c0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
80d0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
80e0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
80f0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
8100: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
8110: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
8120: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
8130: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
8140: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
8150: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
8160: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8170: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8180: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8190: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81a0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
81b0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
81c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
81d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
81e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
81f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
8200: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
8210: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
8220: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8230: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
8240: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8250: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8260: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8270: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8280: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
8290: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
82a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
82b0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
82c0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
82d0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
82e0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
82f0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
8300: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
8310: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
8320: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8330: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8340: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8350: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8360: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8370: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8380: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8390: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
83a0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
83b0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
83c0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
83d0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
83e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
83f0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
8400: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
8410: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8420: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8430: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8440: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8450: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8480: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8490: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
84a0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
84b0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
84c0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
84d0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
84e0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
84f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
8500: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
8510: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
8520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8530: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8540: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8550: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8560: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8570: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8580: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8590: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
85a0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
85b0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
85c0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
85d0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
85e0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
85f0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
8600: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
8610: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
8620: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8630: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8640: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8650: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8660: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8670: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8680: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8690: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
86a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
86b0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
86c0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
86d0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
86e0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
86f0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8700: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8710: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8720: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8730: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8740: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8750: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8760: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8770: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8780: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
87a0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
87b0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
87c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
87d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
87e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
87f0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8810: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8820: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8850: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8860: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8890: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
88a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
88b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
88c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
88d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
88e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
88f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8900: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8910: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8920: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8940: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8950: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8960: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8980: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8990: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
89a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
89b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
89c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
89d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
89e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
89f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8a00: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8a10: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8a30: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8a40: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8a50: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8a70: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8a80: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8a90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8aa0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8ab0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8ad0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8ae0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8af0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8b00: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8b10: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8b20: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8b30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8b40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b50: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8b60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8b70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8b80: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8b90: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8ba0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8bb0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8bc0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8bd0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8be0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8bf0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8c00: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8c10: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8c20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8c30: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8c40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8c50: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8c60: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8c70: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8c80: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8c90: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8ca0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8cb0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8cc0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8cd0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8ce0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8cf0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8d00: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8d10: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8d20: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8d30: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8d40: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8d50: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8d60: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8d70: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8d80: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8d90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8da0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8db0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8dc0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8dd0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8df0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8e00: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8e10: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8e20: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8e30: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8e40: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8e50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e60: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8e70: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8e80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8e90: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8ea0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8ec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ed0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8ee0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8f00: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8f10: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8f20: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8f30: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8f40: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8f60: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8f70: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8f80: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8f90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8fa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8fb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8fc0: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8fd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8fe0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8ff0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9000: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9010: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9020: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9030: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9040: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9050: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9060: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9070: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9080: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9090: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
90a0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
90b0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
90c0: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
90d0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
90e0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
90f0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
9100: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
9110: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9120: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
9130: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
9140: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
9150: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
9160: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
9170: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
9180: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
9190: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
91a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
91b0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
91c0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
91d0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
91e0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
91f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9200: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9210: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
9220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9230: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
9240: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
9250: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
9260: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
9270: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
9280: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9290: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
92a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
92b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
92c0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
92d0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
92e0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
92f0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
9300: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
9310: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
9320: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9330: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9340: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9350: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9360: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9370: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9380: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9390: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
93a0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
93b0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
93c0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
93d0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
93e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
93f0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
9400: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
9410: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
9420: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9430: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9440: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9450: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9460: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9470: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9480: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9490: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
94a0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
94b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
94c0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
94d0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
94e0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
94f0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
9500: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
9510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
9520: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9530: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9540: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9550: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9560: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9570: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9580: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9590: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
95c0: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
95d0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
95e0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9610: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9630: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9640: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9650: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9660: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9670: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9680: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9690: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
96a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
96b0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
96c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
96d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
96e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96f0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9700: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9710: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9720: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9730: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9740: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9750: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9760: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9770: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9780: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9790: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
97a0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
97b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
97c0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
97d0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
97e0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
97f0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
9800: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
9810: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
9820: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9830: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9840: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9850: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9860: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9870: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9880: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9890: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
98a0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
98b0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
98c0: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
98d0: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
98e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
98f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9900: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
9910: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
9920: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9930: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9940: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9950: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9960: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9970: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9980: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9990: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
99a0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
99b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
99c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
99d0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
99e0: 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  +5]);.  }else if
99f0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  ( gap+2<=top ){.
9a00: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
9a10: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
9a20: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
9a30: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
9a40: 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a   satisfy .    **
9a50: 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68   the request. Th
9a60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
9a70: 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69  made from the fi
9a80: 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  rst free slot in
9a90: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73   .    ** the lis
9aa0: 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20  t that is large 
9ab0: 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61  enough to accoma
9ac0: 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  date it..    */.
9ad0: 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72      int pc, addr
9ae0: 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68  ;.    for(addr=h
9af0: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
9b00: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
9b10: 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a  ))>0; addr=pc){.
9b20: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20        int size; 
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9b40: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
9b50: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9b60: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
9b70: 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b   || pc<addr+4 ){
9b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9b90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9ba0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
9bb0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
9bc0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9bd0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
9be0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
9bf0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
9c00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
9c10: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
9c20: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9c30: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
9c40: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
9c60: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
9c70: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
9c80: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
9c90: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  r of.          *
9ca0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
9cb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
9cc0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ge. */.         
9cd0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
9ce0: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
9cf0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
9d00: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29  ta[hdr+7] = (u8)
9d10: 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20  (nFrag + x);.   
9d20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9d30: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
9d40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
9d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9d70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
9d90: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
9da0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
9db0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
9dc0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
9dd0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
9de0: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
9df0: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
9e00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
9e10: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
9e20: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
9e30: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
9e40: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9e60: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
9e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
9e80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9e90: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
9ea0: 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74  ace in the gap t
9eb0: 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74  o satisfy.  ** t
9ec0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  he allocation.  
9ed0: 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65  If not, defragme
9ee0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  nt..  */.  testc
9ef0: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
9f00: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
9f10: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
9f20: 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  {.    rc = defra
9f30: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
9f40: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9f50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
9f60: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9f70: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9f80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
9f90: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
9fa0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
9fb0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
9fc0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
9fd0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
9fe0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
9ff0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
a000: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
a010: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a020: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
a030: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
a040: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
a050: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
a060: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
a070: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
a080: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
a090: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
a0a0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
a0b0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
a0c0: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
a0d0: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
a0e0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
a0f0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
a100: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
a110: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a120: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
a130: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
a140: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
a150: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
a160: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
a170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
a190: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
a1a0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
a1b0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
a1c0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
a1d0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
a1e0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
a1f0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
a200: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
a210: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
a220: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
a230: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
a240: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
a250: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
a260: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
a270: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
a280: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
a290: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
a2a0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
a2b0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
a2c0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
a2d0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
a2e0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
a2f0: 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20  r;.  int iLast; 
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
a320: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
a330: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
a340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a350: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
a360: 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
a370: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
a380: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a390: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a3a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a3b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
a3c0: 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  start>=pPage->hd
a3d0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
a3e0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
a3f0: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
a400: 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e  t + size) <= (in
a410: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
a420: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
a430: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a440: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a450: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a460: 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30   assert( size>=0
a470: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
a480: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
a490: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  */..  if( pPage-
a4a0: 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
a4b0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
a4c0: 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  TE ){.    /* Ove
a4d0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
a4e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
a4f0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
a500: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
a510: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
a520: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
a530: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
a540: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a  , 0, size);.  }.
a550: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
a560: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
a570: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
a580: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
a590: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65  te that.  ** eve
a5a0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
a5b0: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
a5c0: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
a5d0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a  InitPage(),.  **
a5e0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a5f0: 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20   did not detect 
a600: 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c  overlapping cell
a610: 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c  s or.  ** freebl
a620: 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61  ocks that overla
a630: 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f  pped cells.   No
a640: 72 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  r does it detect
a650: 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63   when the.  ** c
a660: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a670: 20 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c   exceeds the val
a680: 75 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  ue in the page h
a690: 65 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65  eader.  If these
a6a0: 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73  .  ** situations
a6b0: 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62   arise, then sub
a6c0: 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f  sequent insert o
a6d0: 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  perations might 
a6e0: 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65  corrupt.  ** the
a6f0: 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77   freelist.  So w
a700: 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65  e do need to che
a710: 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f  ck for corruptio
a720: 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67  n while scanning
a730: 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
a740: 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  st..  */.  hdr =
a750: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a760: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
a770: 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70  + 1;.  iLast = p
a780: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a790: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73  eSize - 4;.  ass
a7a0: 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73  ert( start<=iLas
a7b0: 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  t );.  while( (p
a7c0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
a7d0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
a7e0: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
a7f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67   ){.    if( pbeg
a800: 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20  in<addr+4 ){.   
a810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a820: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a830: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
a840: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  pbegin;.  }.  if
a850: 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29  ( pbegin>iLast )
a860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a880: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a890: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
a8a0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
a8b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a8c0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
a8d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a8e0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
a8f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
a900: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
a910: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
a920: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20   pPage->nFree + 
a930: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
a940: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
a950: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
a960: 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  /.  addr = hdr +
a970: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
a980: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a990: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
a9a0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
a9b0: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
a9c0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a9d0: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
a9e0: 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e  t( pbegin <= (in
a9f0: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
aa00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
aa10: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
aa20: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
aa30: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
aa40: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
aa50: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
aa60: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
aa70: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
aa80: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
aa90: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
aaa0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
aab0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ze);.      if( (
aac0: 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67  frag<0) || (frag
aad0: 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37  >(int)data[hdr+7
aae0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
aaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ab00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ab10: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72  }.      data[hdr
ab20: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
ab30: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
ab40: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
ab50: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
ab60: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
ab70: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
ab80: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
ab90: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
aba0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
abb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
abc0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
abd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
abe0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
abf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
ac00: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ac10: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
ac20: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
ac30: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
ac40: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
ac50: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
ac60: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
ac70: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
ac80: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
ac90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
aca0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
acb0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
acc0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
acd0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
ace0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
acf0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
ad00: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
ad10: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
ad20: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ad30: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
ad40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ad50: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
ad60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ad70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ad80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ad90: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
ada0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
adb0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
adc0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
add0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
ade0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
adf0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
ae00: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
ae10: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
ae20: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
ae30: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
ae40: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
ae50: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
ae60: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
ae70: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
ae80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ae90: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
aea0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
aeb0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
aec0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
aed0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
aee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
aef0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
af00: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
af10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
af20: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
af30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
af40: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
af50: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
af60: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
af70: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
af80: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
af90: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
afa0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
afb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
afc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
afd0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
afe0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
aff0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
b000: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
b010: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
b020: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
b030: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
b040: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
b050: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
b060: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
b070: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
b080: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
b090: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b0a0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
b0b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
b0c0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
b0d0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
b0e0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
b0f0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
b100: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
b110: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b120: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
b130: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
b140: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
b150: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b160: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
b170: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b180: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
b190: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b1a0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
b1b0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b1c0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
b1d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
b1e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b1f0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
b200: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
b210: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
b220: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
b230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b240: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
b250: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
b260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
b270: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
b280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
b290: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
b2a0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
b2b0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
b2c0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
b2d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
b2e0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
b2f0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
b300: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
b310: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
b320: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
b330: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
b340: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b350: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
b360: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
b370: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
b380: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
b390: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
b3a0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
b3b0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
b3c0: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
b3d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
b3e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b410: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
b420: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
b430: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
b440: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
b450: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b460: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
b470: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
b480: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b4a0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
b4b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
b4c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b4d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
b4e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
b4f0: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
b500: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b510: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
b520: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
b530: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
b540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
b550: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
b560: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
b570: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
b580: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
b590: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
b5a0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
b5b0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
b5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
b5d0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b5e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
b5f0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
b600: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
b610: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b620: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
b630: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
b640: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
b650: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
b660: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
b670: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
b680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b690: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
b6a0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
b6b0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
b6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b6d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
b6e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b6f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
b700: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
b710: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b720: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
b730: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
b740: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b750: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
b760: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
b770: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
b780: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b790: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
b7a0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
b7b0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
b7c0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
b7d0: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
b7e0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
b7f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b800: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
b820: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
b830: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
b840: 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67  5536 );.    pPag
b850: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
b860: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
b870: 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67  e - 1);.    pPag
b880: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b890: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b8a0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b8b0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b8c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b8d0: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b8e0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b8f0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  f;.    pPage->aD
b900: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
b910: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
b920: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
b930: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
b940: 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  et];.    top = g
b950: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
b960: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b970: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b980: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b990: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
b9a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
b9b0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
b9c0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
b9d0: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
b9e0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
b9f0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
ba00: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
ba10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba20: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ba30: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
ba40: 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
ba50: 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  (pBt) );..    /*
ba60: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
ba70: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
ba80: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
ba90: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
baa0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
bab0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
bac0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
bad0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
bae0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
baf0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
bb00: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
bb10: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
bb20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
bb30: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
bb40: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
bb50: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
bb60: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
bb70: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
bb80: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
bb90: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
bba0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
bbb0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
bbc0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
bbd0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
bbe0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
bbf0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
bc00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
bc10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bc20: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
bc30: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
bc40: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
bc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bc60: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
bc70: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
bc80: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
bc90: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
bca0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
bcb0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
bcc0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bcd0: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
bce0: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
bcf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
bd00: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
bd10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd20: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
bd30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
bd40: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bd50: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
bd60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bd80: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
bd90: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
bda0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
bdb0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bdc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
bdd0: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
bdf0: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
be00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
be10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
be20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
be30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be40: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
be50: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
be60: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
be70: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
be80: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
be90: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
bea0: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
beb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
bec0: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
bed0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
bee0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
bef0: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
bf00: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
bf10: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf20: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf30: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
bf40: 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62   Start of free b
bf50: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
bf60: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
bf70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf80: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
bf90: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
bfa0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bfb0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
bfc0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
bfd0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
bfe0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
bff0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
c000: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
c010: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c020: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
c030: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
c040: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
c050: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
c060: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
c070: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
c080: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
c090: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
c0a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c0b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c0c0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
c0d0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
c0e0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
c0f0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
c100: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c110: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
c120: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
c130: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c140: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
c150: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
c160: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
c170: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
c180: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
c190: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
c1a0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
c1b0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
c1c0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
c1d0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
c1e0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
c1f0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
c200: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
c210: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
c220: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
c230: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
c240: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
c250: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c260: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
c270: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
c280: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
c290: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
c2a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c2b0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
c2c0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
c2d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c2e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c2f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
c300: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
c310: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
c320: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
c330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
c340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c350: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
c360: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
c370: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
c380: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
c390: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
c3a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c3b0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
c3c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
c3d0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
c3e0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
c3f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c400: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c410: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c420: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c430: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c440: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c450: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c460: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c470: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c480: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c490: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c4a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c4b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c4c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c4d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c4e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c4f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c510: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c520: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c530: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c550: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c560: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
c570: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
c580: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
c590: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c5a0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c5b0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c5c0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c5d0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c5e0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c5f0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c600: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c610: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c620: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c630: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c640: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c650: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c660: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c670: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c680: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
c690: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
c6a0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
c6b0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
c6c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c6d0: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
c6e0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
c6f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c700: 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
c710: 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
c720: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
c730: 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
c740: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
c750: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
c760: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
c770: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
c780: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
c790: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
c7a0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
c7b0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
c7c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
c7d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
c7e0: 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
c7f0: 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
c800: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
c810: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
c820: 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
c830: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
c840: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
c850: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
c860: 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
c870: 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
c880: 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
c890: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
c8a0: 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
c8b0: 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
c8c0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
c8d0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
c8e0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
c8f0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
c900: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
c910: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
c920: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
c930: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
c940: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
c950: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
c960: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c970: 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
c980: 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
c990: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c9a0: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
c9b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c9c0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c9d0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c9e0: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c9f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
ca00: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
ca10: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
ca20: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
ca30: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
ca40: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
ca50: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
ca60: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
ca70: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
ca80: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
ca90: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
caa0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
cab0: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
cac0: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
cad0: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
cae0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
caf0: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
cb00: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
cb10: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
cb20: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
cb30: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
cb40: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
cb50: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
cb60: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
cb70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
cb80: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
cb90: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
cba0: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
cbb0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
cbc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cbd0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
cbe0: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
cbf0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
cc00: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
cc10: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
cc20: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
cc30: 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20  oContent        
cc40: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70  /* Do not load p
cc50: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74  age content if t
cc60: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
cc70: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
cc80: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
cc90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
cca0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
ccb0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
ccc0: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
ccd0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
cce0: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
ccf0: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
cd00: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
cd10: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
cd20: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
cd30: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
cd40: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
cd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cd60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
cd70: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
cd80: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
cd90: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
cda0: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
cdb0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
cdc0: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
cdd0: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
cde0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
cdf0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
ce00: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ce10: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
ce20: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
ce30: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
ce40: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
ce50: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
ce60: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
ce70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ce80: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
ce90: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
cea0: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
ceb0: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
cec0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
ced0: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
cee0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
cef0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
cf00: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
cf10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
cf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
cf40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
cf50: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
cf60: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
cf70: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
cf80: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
cf90: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
cfa0: 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
cfb0: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
cfc0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
cfd0: 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
cfe0: 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
cff0: 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
d000: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d010: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
d020: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
d030: 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
d040: 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
d050: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
d060: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d070: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
d080: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d090: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d0a0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
d0c0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
d0d0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d0e0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d0f0: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
d100: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
d110: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
d120: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d130: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
d140: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
d150: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
d160: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
d170: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
d180: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
d190: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
d1a0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
d1b0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
d1c0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
d1d0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
d1e0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d1f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
d200: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
d210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
d220: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
d230: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
d240: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
d250: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d260: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
d270: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
d280: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d290: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d2a0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
d2b0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
d2c0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
d2d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d2e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
d2f0: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
d300: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
d310: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
d320: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d330: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
d340: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
d350: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
d360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d370: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
d380: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d3a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
d3b0: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
d3c0: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
d3d0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
d3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
d400: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
d410: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
d420: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
d430: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
d440: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
d450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
d460: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
d470: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
d480: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
d490: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
d4a0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
d4b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
d4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d4d0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d4e0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d4f0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
d500: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
d510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
d520: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
d530: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
d540: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d550: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d560: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
d570: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
d580: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
d590: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d5a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
d5b0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
d5c0: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
d5d0: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
d5e0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
d5f0: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
d600: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
d610: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
d620: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
d630: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
d640: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
d650: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
d660: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
d670: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
d680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d690: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
d6a0: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
d6b0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
d6c0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
d6d0: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
d6e0: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
d6f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d700: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
d710: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
d720: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
d730: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
d740: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
d750: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
d760: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d770: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
d780: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
d790: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
d7a0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
d7b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d7c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
d7d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
d7e0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
d7f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
d800: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
d810: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
d820: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
d830: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
d840: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
d850: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
d860: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
d870: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
d880: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
d890: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
d8a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
d8b0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
d8c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
d8d0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
d8e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d8f0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
d900: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
d910: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
d920: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
d930: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
d940: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
d950: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
d960: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
d970: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
d980: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
d990: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
d9a0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
d9b0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
d9c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
d9d0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
d9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
d9f0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
da00: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
da10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
da20: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
da30: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
da40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
da50: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
da60: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
da70: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
da80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da90: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
daa0: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
dab0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
dac0: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
dad0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
dae0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
daf0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
db00: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
db10: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
db20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
db30: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
db40: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
db50: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
db60: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
db70: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
db80: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
db90: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
dba0: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
dbb0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
dbc0: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
dbd0: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
dbe0: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
dbf0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
dc00: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
dc10: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
dc20: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
dc30: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
dc40: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
dc50: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
dc60: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
dc70: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dc80: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
dc90: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
dca0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
dcb0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
dcc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
dcd0: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
dce0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
dcf0: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
dd00: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
dd10: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
dd20: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
dd30: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
dd40: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
dd50: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
dd60: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
dd70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
dd80: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
dd90: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
dda0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
ddb0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
ddc0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
ddd0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
dde0: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
ddf0: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
de00: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
de10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
de20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
de30: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
de40: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
de50: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
de60: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
de70: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
de80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
de90: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
dea0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
deb0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
dec0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
ded0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dee0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
def0: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
df00: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
df10: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
df20: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
df30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
df40: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
df50: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
df60: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
df70: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
df80: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
df90: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
dfa0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
dfb0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
dfc0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
dfd0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
dfe0: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
dff0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
e000: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e010: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e020: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
e030: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
e040: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
e050: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e060: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
e070: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
e080: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e090: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
e0a0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
e0b0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
e0c0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
e0d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e0e0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e0f0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
e100: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
e110: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
e120: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
e130: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
e140: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
e150: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
e160: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
e170: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
e180: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
e190: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
e1a0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
e1b0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
e1c0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
e1d0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
e1e0: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
e1f0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
e200: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
e210: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
e220: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
e230: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
e240: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
e250: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
e260: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
e270: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
e280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e290: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
e2a0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
e2b0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
e2c0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
e2d0: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
e2e0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e2f0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
e300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e310: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
e320: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
e330: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
e340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e350: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
e360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e370: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
e380: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e390: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
e3a0: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
e3b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e3c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
e3d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
e3e0: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
e3f0: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
e400: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
e410: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
e420: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
e430: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
e440: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e450: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e460: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
e470: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
e480: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e490: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
e4a0: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
e4b0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
e4c0: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
e4d0: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
e4e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
e4f0: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
e500: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
e510: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
e520: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
e530: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
e540: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
e550: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e560: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
e570: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
e580: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
e590: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
e5a0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
e5b0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
e5c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
e5d0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
e5e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e5f0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
e600: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e620: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
e630: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
e640: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
e650: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
e660: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e670: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
e680: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
e690: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
e6a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
e6b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e6c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e6d0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e6e0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e6f0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
e700: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
e710: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
e720: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
e730: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
e740: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
e750: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
e760: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
e770: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
e780: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
e790: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
e7a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
e7b0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
e7c0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e7d0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
e7e0: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
e7f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
e800: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e810: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
e820: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e830: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
e840: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e850: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
e860: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e870: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
e880: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
e890: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
e8a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e8b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e8c0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e8d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e8e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e8f0: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
e900: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
e910: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
e920: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
e930: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
e940: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
e950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
e970: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
e980: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
e9c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e9d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
e9e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e9f0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
ea00: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ea10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ea20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
ea30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
ea40: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
ea50: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
ea60: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
ea70: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ea80: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ea90: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
eaa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
eab0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
eac0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
ead0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
eae0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
eaf0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
eb00: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
eb10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eb20: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
eb30: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
eb40: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
eb50: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
eb60: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
eb70: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
eb80: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
eb90: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
eba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ebb0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
ebc0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
ebd0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
ebe0: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
ec10: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
ec20: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
ec30: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
ec40: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
ec50: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
ec60: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
ec70: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
ec80: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
ec90: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
eca0: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
ecb0: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
ecc0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ece0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ecf0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ed10: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ed20: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ed30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed40: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ed50: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ed70: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ed80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ed90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
eda0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
edb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
edc0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
edd0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ede0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
edf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ee00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ee10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ee20: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ee30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ee40: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ee50: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ee60: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ee70: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ee80: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ee90: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
eea0: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
eeb0: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
eec0: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
eed0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
eee0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
eef0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
ef00: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
ef10: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
ef20: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
ef30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ef40: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
ef50: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
ef60: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
ef70: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
ef80: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
ef90: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
efa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
efb0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
efc0: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
efd0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
efe0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
eff0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
f000: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
f010: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
f020: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
f030: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
f040: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
f050: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
f060: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
f070: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
f080: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
f090: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f0a0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
f0b0: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
f0c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f0d0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
f0e0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
f0f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f100: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
f110: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f120: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f130: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f140: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f150: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f160: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f170: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f180: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f190: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f1a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f1b0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f1c0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f1d0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f1e0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f1f0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f200: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f220: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f230: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f240: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f260: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f270: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
f280: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
f290: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
f2a0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
f2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f2c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f2d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f2e0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f2f0: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
f300: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
f310: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
f320: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
f330: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f340: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
f350: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f360: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
f370: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
f380: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
f390: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
f3a0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
f3b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
f3c0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
f3d0: 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
f3e0: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
f3f0: 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
f400: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
f410: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
f420: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
f430: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
f440: 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70  endif.    pBt->p
f450: 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
f460: 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
f470: 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
f480: 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
f490: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
f4a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
f4b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f4c0: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
f4d0: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
f4e0: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
f4f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
f500: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
f510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f520: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f530: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f540: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
f550: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
f560: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
f570: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
f580: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
f590: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
f5a0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
f5b0: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
f5c0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
f5d0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
f5e0: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
f5f0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
f600: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
f610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f620: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
f630: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
f640: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
f650: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
f660: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
f670: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
f680: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
f690: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
f6a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f6b0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
f6c0: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
f6d0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
f6e0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
f6f0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
f700: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f710: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
f720: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
f730: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
f740: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
f750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f760: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
f770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f780: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
f790: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
f7a0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f7b0: 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
f7c0: 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
f7d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f7e0: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
f7f0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
f800: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
f810: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
f820: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
f830: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
f840: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f850: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
f860: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f880: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f890: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
f8a0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
f8b0: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
f8c0: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
f8d0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
f8e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f8f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
f900: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
f910: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
f920: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
f930: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
f940: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
f950: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
f960: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f970: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f980: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f990: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f9a0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
f9b0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f9c0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
f9d0: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
f9e0: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
f9f0: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
fa00: 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
fa10: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
fa20: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
fa30: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
fa40: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
fa50: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
fa60: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
fa70: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
fa80: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
fa90: 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
faa0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
fab0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
fac0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
fad0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
fae0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
faf0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
fb00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fb10: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
fb20: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
fb30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fb40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fb50: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
fb60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
fb70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
fb80: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fb90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fba0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fbb0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
fbc0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
fbd0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
fbe0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fbf0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fc00: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
fc10: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fc20: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fc30: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
fc40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fc50: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
fc60: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
fc70: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
fc80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fc90: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
fca0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fcb0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
fcc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
fcd0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
fce0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
fcf0: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
fd00: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
fd10: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
fd20: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
fd30: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
fd40: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
fd50: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
fd60: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
fd70: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
fd80: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
fd90: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fda0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
fdb0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
fdc0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
fdd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
fde0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
fdf0: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
fe00: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
fe10: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
fe20: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
fe30: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
fe40: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
fe50: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
fe60: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
fe70: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
fe80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
fe90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
fea0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
feb0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
fec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
fed0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
fee0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
fef0: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
ff00: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
ff10: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
ff20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ff30: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
ff40: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
ff50: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
ff60: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ff70: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
ff80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
ff90: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
ffa0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
ffb0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ffc0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
ffd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ffe0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
fff0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
10000 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
10010 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
10020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10030 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
10040 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
10050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10060 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
10070 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
10080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10090 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
100a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
100b0 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
100c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
100d0 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
100e0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
100f0 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
10100 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
10110 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
10120 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
10130 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
10140 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
10150 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
10160 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
10170 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
10180 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
10190 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
101a0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
101b0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
101c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
101d0 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
101e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
101f0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
10200 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
10210 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
10220 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
10230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10240 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
10250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
10260 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
10270 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
10280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10290 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
102a0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
102b0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
102c0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
102d0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
102e0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
102f0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
10300 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
10310 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
10320 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10330 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
10340 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
10350 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
10360 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
10370 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
10380 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
10390 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
103a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
103b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
103c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
103d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
103e0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
103f0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
10400 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
10410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10420 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
10430 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10440 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
10450 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10460 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10470 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10480 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
10490 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
104a0 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
104b0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
104c0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
104d0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
104e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
104f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
10500 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
10510 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10520 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10530 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
10540 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
10550 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
10560 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10570 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10580 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
10590 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
105a0 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
105b0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
105c0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
105d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
105e0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
105f0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
10600 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
10610 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10630 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
10640 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
10650 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
10660 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
10670 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
10680 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10690 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
106a0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
106b0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
106c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
106d0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
106e0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
106f0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
10700 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
10710 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
10720 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
10730 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
10740 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
10750 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10760 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
10770 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
10780 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
10790 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
107a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
107b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
107c0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
107d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
107e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
107f0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
10800 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
10810 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
10820 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
10830 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
10840 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
10850 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
10860 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
10870 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
10880 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10890 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
108a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
108b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
108c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
108d0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
108e0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
108f0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
10900 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
10910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10920 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10930 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10940 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
10950 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
10960 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
10970 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
10980 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
10990 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
109a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
109b0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
109c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
109d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
109e0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
109f0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
10a00 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
10a10 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
10a20 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
10a30 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
10a40 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
10a50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
10a60 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
10a70 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
10a80 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
10a90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
10aa0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
10ab0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
10ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10ad0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
10ae0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
10af0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
10b00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
10b10 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
10b20 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
10b30 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
10b40 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
10b50 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
10b60 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
10b70 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
10b80 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
10b90 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
10ba0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
10bb0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
10bc0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
10bd0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
10be0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
10bf0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
10c00 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
10c10 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
10c20 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
10c30 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
10c40 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
10c50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
10c60 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
10c70 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
10c80 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
10c90 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
10ca0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
10cb0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
10cc0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10cd0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
10ce0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
10cf0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
10d00 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10d10 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
10d20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10d30 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
10d40 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
10d50 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10d70 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
10d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10d90 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10da0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10db0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10dc0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10dd0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
10de0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
10df0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
10e00 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
10e10 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
10e20 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
10e30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
10e40 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
10e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10e70 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
10e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10e90 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10ea0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10eb0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10ec0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10ed0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
10ee0 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
10ef0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
10f00 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
10f10 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
10f20 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
10f30 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
10f40 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
10f50 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
10f60 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
10f70 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
10f80 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
10f90 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
10fa0 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
10fb0 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
10fc0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10fd0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
10fe0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
10ff0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
11000 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
11010 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
11020 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11030 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
11040 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
11050 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
11060 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
11070 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
11080 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11090 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
110a0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
110b0 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
110c0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
110d0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
110e0 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
110f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
11100 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
11110 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
11120 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11130 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
11140 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11150 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11160 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11170 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11180 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11190 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
111a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
111b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
111c0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
111d0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
111e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
111f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11210 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11220 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11230 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11240 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11250 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11260 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11270 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
11280 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11290 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
112a0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
112b0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
112c0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
112d0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
112e0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
112f0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11300 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11310 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11320 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11330 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11340 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11350 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11360 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11370 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
11380 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
11390 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
113a0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
113b0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
113c0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
113d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
113e0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
113f0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
11400 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
11410 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11430 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11440 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11450 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65  on */.  int leve
11460 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11470 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
11480 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
11490 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
114a0 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  /.  int fullSync
114b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ,          /* PR
114c0 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20  AGMA fullfsync. 
114d0 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c  */.  int ckptFul
114e0 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50  lSync       /* P
114f0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
11500 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a  _fullfync */.){.
11510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11520 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11540 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
11550 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11560 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
11570 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69  vel<=3 );.  sqli
11580 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11590 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
115a0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
115b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
115c0 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70  l, fullSync, ckp
115d0 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  tFullSync);.  sq
115e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
115f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11600 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11610 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11620 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11630 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11640 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11650 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11660 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11670 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
11680 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
11690 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
116a0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
116b0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
116c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
116d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
116e0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
116f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11700 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11710 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11720 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11730 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11740 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11760 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11770 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
11780 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
117a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
117b0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
117c0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
117d0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
117e0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
117f0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
11800 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
11810 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11830 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
11840 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
11850 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
11860 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
11870 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
11880 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
11890 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
118a0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
118b0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
118c0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
118d0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
118e0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
118f0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
11900 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
11910 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
11920 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
11930 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
11940 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
11950 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
11960 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
11970 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
11980 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
11990 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
119a0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
119b0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
119c0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
119d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
119e0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
119f0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
11a00 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
11a10 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
11a20 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
11a30 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
11a40 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
11a50 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
11a60 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
11a70 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
11a80 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
11a90 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
11aa0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
11ab0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
11ac0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
11ad0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
11ae0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11af0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11b00 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
11b10 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
11b20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
11b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11b40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11b50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11b60 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
11b70 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
11b80 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
11b90 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11ba0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
11bb0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
11bc0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
11bd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11be0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
11bf0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11c00 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
11c10 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
11c20 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
11c30 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
11c40 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
11c50 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
11c60 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
11c70 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
11c80 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
11c90 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
11ca0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
11cb0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
11cc0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
11cd0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11ce0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
11cf0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11d00 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
11d10 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
11d20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
11d30 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
11d40 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
11d50 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11d60 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11d70 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11d80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
11d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
11da0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
11db0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11dc0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
11dd0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11de0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
11df0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
11e00 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
11e10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11e20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11e40 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11e50 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11e60 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11e70 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
11e80 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
11e90 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
11ea0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
11eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
11ec0 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
11ed0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11ee0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
11ef0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
11f00 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
11f10 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
11f20 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
11f30 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
11f40 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
11f50 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
11f60 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
11f70 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
11f80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
11f90 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
11fa0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
11fb0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
11fc0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
11fd0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
11fe0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
11ff0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12000 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12010 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12020 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12030 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12040 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12050 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12060 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12070 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12080 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12090 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
120a0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
120b0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
120c0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
120d0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
120e0 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
120f0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
12100 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
12110 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
12120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12130 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
12140 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
12150 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12160 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12170 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
12180 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20  QLITE_HAS_CODEC 
12190 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  || SQLITE_DEBUG 
121a0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
121b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
121c0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
121d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
121e0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
121f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
12200 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
12210 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
12220 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
12230 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
12240 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
12250 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
12260 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
12270 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
12280 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
12290 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
122a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
122b0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
122c0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
122d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
122e0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
122f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12300 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12310 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12320 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12330 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
12340 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
12350 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
12360 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
12370 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
12380 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
12390 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
123a0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
123b0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
123c0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
123d0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
123e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
123f0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
12400 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12410 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12420 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12430 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12440 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12450 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
12460 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
12470 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
12480 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
12490 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
124a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
124b0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
124c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
124d0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
124e0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
124f0 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
12500 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
12510 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
12520 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
12530 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
12540 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
12550 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
12560 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
12570 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
12580 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
12590 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
125a0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
125b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
125c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
125d0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
125e0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
125f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
12600 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
12610 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
12620 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
12630 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
12640 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
12650 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
12660 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
12670 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
12680 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
12690 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
126a0 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66  turn b;.}.#endif
126b0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
126c0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
126d0 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
126e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
126f0 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
12700 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
12710 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
12720 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
12730 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
12740 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
12750 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
12760 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
12770 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
12780 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
12790 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
127a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
127b0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
127c0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
127d0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
127e0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
127f0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
12800 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
12810 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
12820 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
12830 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
12840 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
12850 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12860 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
12870 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
12880 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
12890 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
128a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
128b0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
128c0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
128d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
128e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
128f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12900 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
12910 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
12920 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
12930 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
12940 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
12960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
12970 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
12980 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
12990 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
129a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
129b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
129c0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
129d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
129e0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
129f0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
12a00 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
12a10 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
12a20 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
12a30 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
12a40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12a50 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
12a60 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
12a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12a80 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
12a90 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
12aa0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
12ab0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
12ac0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12ad0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
12ae0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
12af0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12b00 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
12b10 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
12b20 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12b30 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
12b40 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
12b50 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
12b60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
12b80 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
12b90 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
12ba0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
12bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
12bc0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
12bd0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
12be0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
12bf0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
12c00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
12c10 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
12c20 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
12c30 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
12c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
12c50 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
12c60 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
12c70 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
12c80 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
12c90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
12ca0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
12cb0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
12cc0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
12cd0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
12ce0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
12cf0 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
12d00 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12d20 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12d30 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
12d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12d50 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
12d60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12d70 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
12d80 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
12d90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
12da0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
12db0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
12dc0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
12dd0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
12de0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12df0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12e00 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
12e10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12e20 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12e30 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
12e40 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
12e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12e60 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
12e80 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
12e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12ea0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
12eb0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
12ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
12ee0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12ef0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
12f00 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
12f10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
12f20 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
12f30 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
12f40 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
12f50 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
12f60 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
12f70 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
12f80 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
12f90 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
12fa0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
12fb0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12fc0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
12fd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12fe0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
12ff0 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
13000 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
13010 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
13020 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
13030 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
13040 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
13050 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
13060 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
13070 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
13080 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
13090 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
130a0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
130b0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
130c0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
130d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
130e0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
130f0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
13100 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13110 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13130 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
13140 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
13150 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
13160 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13170 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
13180 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
13190 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
131a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
131b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
131c0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
131d0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
131e0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
131f0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
13200 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13210 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
13220 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13230 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
13240 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
13250 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
13260 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
13270 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
13280 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
13290 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
132a0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
132b0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
132c0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
132d0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
132e0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
132f0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
13300 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
13310 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
13320 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
13330 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
13340 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
13350 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
13360 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
13370 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
13380 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
13390 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
133a0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
133b0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
133c0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
133d0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
133e0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
133f0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
13400 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13410 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
13420 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
13430 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
13440 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
13450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13460 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
13470 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
13480 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
13490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
134a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
134b0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
134c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
134d0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
134e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
134f0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
13500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13510 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
13520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
13530 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
13540 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
13550 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
13560 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
13570 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
13580 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
13590 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
135a0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
135b0 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
135c0 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
135d0 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
135e0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
135f0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
13600 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
13610 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
13620 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
13630 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
13640 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
13650 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
13660 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
13670 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
13680 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
13690 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
136a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
136b0 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
136c0 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
136d0 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
136e0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
136f0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
13700 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
13710 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
13720 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
13730 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
13740 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
13750 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13760 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13770 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
13780 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
13790 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
137a0 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
137b0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
137c0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
137d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
137e0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
137f0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
13800 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
13810 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
13820 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
13830 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
13840 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
13850 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
13860 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
13870 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
13880 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
13890 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
138a0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
138b0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
138c0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
138d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
138e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
138f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
13900 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
13910 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
13920 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
13930 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
13940 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13950 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
13960 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
13970 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
13980 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
13990 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
139a0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
139b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
139c0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
139d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
139e0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13a10 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
13a20 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
13a30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13a40 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
13a50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
13a60 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
13a70 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
13a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13aa0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
13ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13ad0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
13ae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13af0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13b00 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
13b10 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13b20 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
13b30 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
13b40 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
13b50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13b60 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
13b70 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13b80 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
13b90 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
13ba0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13bb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
13bc0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
13bd0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
13be0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
13bf0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
13c00 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
13c10 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
13c20 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
13c30 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
13c40 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
13c50 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
13c60 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
13c70 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
13c80 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
13c90 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
13ca0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
13cb0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
13cc0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
13cd0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
13ce0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
13cf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13d00 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
13d10 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
13d20 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
13d30 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
13d40 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
13d50 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
13d60 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
13d70 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
13d80 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
13d90 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
13da0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
13db0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
13dc0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
13dd0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
13de0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
13df0 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
13e00 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
13e10 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
13e20 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
13e30 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
13e40 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13e50 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
13e60 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13e70 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
13e80 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
13e90 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
13ea0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
13eb0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
13ec0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
13ed0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
13ee0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
13ef0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
13f00 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
13f10 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
13f20 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
13f30 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
13f40 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
13f50 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
13f60 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
13f70 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
13f80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
13f90 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
13fa0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
13fb0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
13fc0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
13fd0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
13fe0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
13ff0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
14000 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
14010 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
14020 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
14030 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
14040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
14050 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
14060 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
14070 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
14080 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
14090 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
140a0 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
140b0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
140c0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
140d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
140e0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
140f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
14100 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
14110 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
14120 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
14130 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
14140 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
14150 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14160 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
14170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14180 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14190 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
141a0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
141b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
141c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
141d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
141e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
141f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
14200 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
14210 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
14220 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
14230 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14240 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
14250 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
14260 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
14270 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
14280 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14290 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
142a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
142b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
142c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
142d0 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ta );.    releas
142e0 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
142f0 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61  1);.    pBt->pPa
14300 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
14310 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
14320 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
14330 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
14340 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
14350 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
14360 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
14370 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
14380 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
14390 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
143a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
143b0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
143c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
143d0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
143e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
143f0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
14400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14410 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14420 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
14430 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
14440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14450 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
14460 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
14470 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
14480 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
14490 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
144a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
144b0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
144c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
144d0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
144e0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
144f0 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
14500 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
14510 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
14520 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
14530 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
14540 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
14550 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
14560 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
14570 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
14580 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
14590 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
145a0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
145b0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
145c0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
145d0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
145e0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
145f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
14600 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
14610 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
14620 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
14630 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
14640 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
14650 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
14660 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
14670 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
14680 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
14690 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
146a0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
146b0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
146c0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
146d0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
146e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
146f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
14700 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
14710 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
14720 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
14730 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
14740 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
14750 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14760 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
14770 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
14780 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
14790 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
147a0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
147b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
147c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
147d0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
147e0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
147f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14800 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
14810 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
14820 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
14830 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
14840 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
14850 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
14860 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
14870 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
14880 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
14890 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
148a0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
148b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
148c0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
148d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
148e0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
148f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
14900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14910 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
14920 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
14930 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
14940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14950 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14960 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
14970 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
14980 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
14990 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
149a0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
149b0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
149c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
149d0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
149e0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
149f0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
14a00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14a10 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
14a20 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
14a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
14a40 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
14a50 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
14a60 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
14a70 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
14a80 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
14a90 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
14aa0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
14ab0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
14ac0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
14ad0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
14ae0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
14af0 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
14b00 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
14b10 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
14b20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
14b30 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
14b40 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
14b50 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
14b60 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
14b70 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
14b80 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
14b90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14ba0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
14bb0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
14bc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14bd0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
14be0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
14bf0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
14c00 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14c10 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
14c20 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
14c30 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
14c40 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
14c50 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
14c60 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
14c70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
14c80 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
14c90 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
14ca0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14cb0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
14cc0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
14cd0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
14ce0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
14cf0 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
14d00 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
14d10 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
14d20 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
14d30 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
14d40 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
14d50 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
14d60 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
14d70 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
14d80 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
14d90 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
14da0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
14db0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
14dc0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
14dd0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
14de0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
14df0 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
14e00 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
14e10 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
14e20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
14e30 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
14e40 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
14e50 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
14e60 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
14e70 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
14e80 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
14e90 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
14ea0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
14eb0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
14ec0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
14ed0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
14ee0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
14ef0 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
14f00 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
14f10 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
14f20 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14f30 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
14f40 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
14f50 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
14f60 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
14f70 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
14f80 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
14f90 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
14fa0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
14fb0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
14fc0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
14fd0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
14fe0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
14ff0 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
15000 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15010 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
15020 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
15030 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
15040 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
15050 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15060 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
15070 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
15080 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15090 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
150a0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
150b0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
150c0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
150d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
150e0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
150f0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
15100 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
15110 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
15120 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
15130 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
15140 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
15150 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15160 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
15170 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
15180 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
15190 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
151a0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
151b0 73 65 72 74 28 20 70 42 74 2d 3e 62 44 6f 54 72  sert( pBt->bDoTr
151c0 75 6e 63 61 74 65 3d 3d 30 20 29 3b 0a 0a 20 20  uncate==0 );..  
151d0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
151e0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
151f0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
15200 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
15210 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
15220 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15230 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
15240 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
15250 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15260 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15270 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
15280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15290 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
152a0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
152b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
152c0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
152d0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
152e0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
152f0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
15300 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
15310 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
15320 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
15330 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
15340 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
15350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
15360 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
15370 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15380 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
15390 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
153a0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
153b0 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
153c0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
153d0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
153e0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
153f0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
15400 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
15410 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15420 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15430 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
15440 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
15450 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
15460 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
15470 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
15480 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15490 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
154a0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
154b0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
154c0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
154d0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
154e0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
154f0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
15500 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
15510 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15520 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
15530 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
15540 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
15550 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
15560 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
15570 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
15580 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
15590 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
155a0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
155b0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
155c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
155d0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
155e0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
155f0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
15600 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
15610 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
15620 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
15630 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
15640 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
15650 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
15660 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
15670 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15680 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
15690 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
156a0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
156b0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
156c0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
156d0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
156e0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
156f0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
15700 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
15710 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
15720 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
15730 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
15740 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
15750 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
15760 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
15770 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
15780 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
15790 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
157a0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
157b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
157c0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
157d0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
157e0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
157f0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
15800 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
15810 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
15820 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
15830 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
15840 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
15850 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
15860 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
15870 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
15880 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
15890 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
158a0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
158b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
158c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
158d0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
158e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
158f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15900 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15920 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
15930 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
15940 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
15950 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
15960 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15980 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
15990 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
159a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
159b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
159c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
159d0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
159e0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
159f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
15a00 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
15a10 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
15a20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
15a30 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
15a40 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
15a50 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
15a60 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
15a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15a80 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
15a90 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
15aa0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
15ab0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
15ac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ad0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
15ae0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
15af0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
15b00 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
15b10 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
15b20 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
15b30 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
15b40 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
15b50 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
15b60 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
15b70 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
15b80 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
15b90 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
15ba0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
15bb0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
15bc0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
15bd0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
15be0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
15bf0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
15c00 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
15c10 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15c20 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
15c30 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
15c40 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
15c50 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
15c60 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
15c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15c80 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
15c90 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
15ca0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
15cb0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
15cc0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
15cd0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
15ce0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
15cf0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
15d00 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15d10 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
15d20 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
15d30 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
15d40 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
15d50 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
15d60 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
15d70 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
15d80 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
15d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15da0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
15db0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
15dc0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
15dd0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
15de0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
15df0 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
15e00 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
15e10 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
15e20 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
15e30 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
15e40 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
15e50 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
15e60 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
15e70 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
15e80 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
15e90 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15ea0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
15eb0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
15ec0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
15ed0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15ee0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
15ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15f10 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
15f20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
15f30 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
15f40 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
15f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15f60 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
15f70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15f80 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
15f90 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
15fa0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
15fb0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
15fc0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
15fd0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
15fe0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
15ff0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
16000 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
16010 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
16020 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
16030 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
16040 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
16050 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
16060 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
16070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16080 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
16090 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
160a0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
160b0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
160c0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
160d0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
160e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
160f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16100 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16110 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
16120 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
16130 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
16140 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
16150 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
16160 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
16170 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
16180 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
16190 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
161a0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
161b0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
161c0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
161d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
161e0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
161f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
16200 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
16230 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
16240 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
16270 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
16280 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
162b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
162c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
162d0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
162e0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
162f0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
16300 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
16310 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
16320 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16330 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
16340 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
16350 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
16360 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
16370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16380 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
16390 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
163a0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
163b0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
163c0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
163d0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
163e0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
163f0 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
16400 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
16410 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
16420 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
16430 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16440 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
16450 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
16460 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
16470 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
16480 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
16490 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
164a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
164b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
164c0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
164d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
164e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
164f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
16500 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
16510 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
16520 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
16530 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
16540 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
16550 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
16560 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
16570 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
16580 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
16590 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
165a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
165b0 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
165c0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
165d0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
165e0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
165f0 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
16600 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
16610 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
16620 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
16630 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
16640 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
16650 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
16660 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
16670 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
16680 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
16690 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
166a0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
166b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
166c0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
166d0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
166e0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
166f0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
16720 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
16730 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
16740 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
16750 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
16760 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
16770 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
16780 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
16790 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
167a0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
167b0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
167c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
167d0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
167e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
167f0 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
16800 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
16810 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16820 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
16830 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
16840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
16850 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
16860 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
16870 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
16880 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
16890 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
168a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
168b0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
168c0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
168d0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
168e0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
168f0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
16900 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
16910 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16920 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
16940 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
16950 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
16960 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
16970 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
16980 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
16990 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
169a0 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
169b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
169c0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
169d0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
169e0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
169f0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
16a00 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
16a10 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
16a20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
16a30 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
16a40 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
16a50 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
16a60 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
16a70 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
16a80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
16a90 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
16aa0 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
16ab0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
16ac0 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
16ad0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
16ae0 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
16af0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
16b00 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
16b10 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
16b20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
16b30 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
16b40 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
16b50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
16b80 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
16b90 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
16ba0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
16bb0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
16bc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16be0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
16bf0 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
16c00 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
16c10 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
16c20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
16c30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16c40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16c50 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
16c60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16c80 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
16c90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
16ca0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
16cb0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
16cc0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
16cd0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
16ce0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
16cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16d00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
16d10 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
16d20 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
16d30 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
16d40 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
16d50 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
16d60 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
16d70 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
16d80 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
16d90 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
16da0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
16db0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
16dc0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
16dd0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
16de0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
16df0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
16e00 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
16e10 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
16e20 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
16e30 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
16e40 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
16e50 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
16e60 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
16e70 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
16e80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16e90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
16ea0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
16eb0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
16ec0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
16ed0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
16ee0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
16ef0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16f00 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
16f10 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
16f20 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
16f30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
16f40 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
16f50 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
16f60 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
16f70 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
16f80 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
16f90 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
16fa0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
16fb0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
16fc0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
16fd0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
16fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
16ff0 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
17000 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
17010 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
17020 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
17030 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
17040 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
17050 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
17060 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
17070 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
17080 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
17090 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
170a0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
170b0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
170c0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
170d0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
170e0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
170f0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
17100 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
17110 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17120 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
17140 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
17150 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
17160 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
17170 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
17180 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
17190 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
171a0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
171b0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
171c0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
171d0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
171e0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
171f0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
17200 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
17210 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
17220 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17230 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
17240 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
17250 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
17260 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
17270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17280 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17290 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
172a0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
172b0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
172c0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
172d0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
172e0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
172f0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
17300 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
17310 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
17320 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
17330 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
17340 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
17350 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
17360 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
17370 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
17380 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
17390 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
173a0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
173b0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
173c0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
173d0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
173e0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
173f0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
17400 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
17410 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
17420 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
17430 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
17440 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
17450 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
17460 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
17470 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
17480 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
17490 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
174a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
174b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
174c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
174d0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
174e0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
174f0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
17500 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
17510 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
17520 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17530 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
17540 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
17550 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
17560 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17580 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17590 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
175a0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
175b0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
175c0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
175d0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
175e0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
175f0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
17600 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
17610 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
17620 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
17630 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
17640 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
17650 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
17660 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
17670 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
17680 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
17690 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
176a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
176b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
176c0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
176d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
176e0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
176f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
17700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17710 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17720 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
17730 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17740 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
17750 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
17760 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
17770 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
17780 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
17790 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
177a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
177b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
177c0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
177d0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
177e0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
177f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17800 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
17810 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
17820 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
17830 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
17840 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
17850 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
17860 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
17870 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
17880 2c 20 75 38 29 3b 0a 23 64 65 66 69 6e 65 20 42  , u8);.#define B
17890 54 41 4c 4c 4f 43 5f 41 4e 59 20 20 20 30 20 20  TALLOC_ANY   0  
178a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
178b0 63 61 74 65 20 61 6e 79 20 70 61 67 65 20 2a 2f  cate any page */
178c0 0a 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43  .#define BTALLOC
178d0 5f 45 58 41 43 54 20 31 20 20 20 20 20 20 20 20  _EXACT 1        
178e0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 65     /* Allocate e
178f0 78 61 63 74 20 70 61 67 65 20 69 66 20 70 6f 73  xact page if pos
17900 73 69 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  sible */.#define
17910 20 42 54 41 4c 4c 4f 43 5f 4c 45 20 20 20 20 32   BTALLOC_LE    2
17920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
17930 6c 6f 63 61 74 65 20 61 6e 79 20 70 61 67 65 20  locate any page 
17940 3c 3d 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  <= the parameter
17950 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f   */../*.** Perfo
17960 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
17970 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
17980 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
17990 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
179a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
179b0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
179c0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
179d0 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
179e0 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
179f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
17a00 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
17a10 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
17a20 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
17a30 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
17a40 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
17a50 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
17a60 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
17a70 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
17a80 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
17a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
17aa0 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
17ab0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
17ac0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
17ad0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
17ae0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
17af0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
17b00 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17b10 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
17b20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
17b30 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
17b40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
17b50 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
17b60 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
17b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
17b80 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
17b90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
17ba0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
17bb0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
17bc0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
17bd0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
17be0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
17bf0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
17c00 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
17c10 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
17c20 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
17c30 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
17c40 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a  um-on-commmit .*
17c50 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
17c60 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
17c70 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
17c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
17c90 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
17ca0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
17cb0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
17cc0 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
17cd0 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
17ce0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
17cf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
17d00 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
17d10 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
17d20 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
17d30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17d40 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
17d60 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
17d70 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
17d80 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
17d90 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
17da0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
17db0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
17dc0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
17dd0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
17de0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
17df0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
17e00 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
17e10 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
17e20 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
17e30 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
17e40 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
17e50 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
17e60 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
17e70 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
17e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17e90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17ea0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
17eb0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
17ec0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
17ed0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17ee0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
17ef0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
17f00 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
17f10 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
17f20 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
17f30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
17f40 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
17f50 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
17f60 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
17f70 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
17f80 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
17f90 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
17fa0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
17fb0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
17fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
17fd0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
17fe0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
17ff0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
18000 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
18010 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
18020 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
18030 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
18040 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
18050 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
18060 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
18070 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
18080 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18090 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
180a0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
180b0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
180c0 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
180d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
180e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
180f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18100 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
18120 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
18130 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
18140 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
18150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
18160 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
18170 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
18180 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
18190 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
181a0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
181b0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
181c0 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
181d0 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
181e0 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
181f0 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
18200 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
18210 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
18220 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
18230 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
18240 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
18250 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
18260 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
18270 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
18280 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
18290 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
182a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
182b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
182c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
182d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
182e0 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
182f0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
18300 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
18310 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
18320 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
18330 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
18340 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
18350 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
18360 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
18370 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
18380 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
18390 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
183a0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
183b0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
183c0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
183d0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
183e0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
183f0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
18400 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
18410 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
18420 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
18430 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
18440 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
18450 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
18460 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
18470 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
18480 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
18490 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
184a0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
184b0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
184c0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
184d0 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
184e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
184f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18500 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18510 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
18520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18540 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18550 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
18560 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
18570 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
18580 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18590 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
185a0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
185b0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
185c0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
185d0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
185e0 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21  , iFreePg, nFin!
185f0 3d 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  =0);.      relea
18600 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
18610 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18630 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18640 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18650 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
18660 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
18670 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
18680 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
18690 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
186a0 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
186b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
186c0 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
186d0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
186e0 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
186f0 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
18700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18710 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18720 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
18730 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
18740 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
18750 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
18760 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
18770 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
18780 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
18790 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
187a0 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
187b0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
187c0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
187d0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
187e0 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
187f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
18800 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
18810 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18820 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
18830 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
18840 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
18850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18860 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
18870 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
18880 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
18890 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
188a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
188b0 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
188c0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
188d0 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
18900 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
18910 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
18920 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
18930 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
18940 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
18950 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
18960 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
18970 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
18980 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
18990 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
189a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
189b0 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
189c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
189d0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
189e0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
189f0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
18a00 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
18a10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18a20 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
18a30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
18a40 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
18a50 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
18a60 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
18a70 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
18a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
18a90 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
18aa0 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
18ab0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
18ac0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
18ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
18ae0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18af0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
18b00 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
18b10 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
18b20 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
18b30 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
18b40 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
18b50 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
18b60 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
18b70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
18b80 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
18b90 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
18ba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18bb0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
18bc0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
18bd0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
18be0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
18bf0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18c00 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
18c10 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18c20 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
18c30 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
18c40 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
18c50 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
18c60 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
18c70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
18c80 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
18c90 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
18ca0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
18cb0 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
18cc0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18cd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18ce0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
18cf0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
18d00 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
18d10 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
18d20 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
18d30 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18d40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
18d50 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
18d60 0a 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74  .      invalidat
18d70 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
18d80 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
18d90 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
18da0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
18db0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ig, 0);.      if
18dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18de0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18df0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
18e00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
18e10 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
18e20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
18e30 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
18e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
18e50 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
18e60 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
18e70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
18e80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18ea0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18eb0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
18ec0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
18ed0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
18ee0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
18ef0 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
18f00 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
18f10 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
18f20 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18f30 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
18f40 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
18f50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18f60 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18f70 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
18f80 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
18f90 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
18fa0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
18fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
18fc0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
18fd0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
18fe0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
18ff0 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
19000 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
19010 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
19020 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
19030 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
19040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
19050 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19060 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
19070 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
19080 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
19090 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
190a0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
190b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
190c0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
190d0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
190e0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
190f0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
19100 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
19110 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
19120 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
19130 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
19140 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19150 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
19160 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
19170 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
19180 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
19190 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
191a0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
191b0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
191c0 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
191d0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
191e0 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
191f0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
19200 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
19210 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
19220 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
19230 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
19240 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
19250 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
19260 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
19270 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
19280 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19290 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
192a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
192b0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
192c0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
192d0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
192e0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
192f0 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
19300 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
19310 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
19320 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
19330 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
19340 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
19350 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
19360 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
19370 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19380 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
19390 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
193a0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
193b0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
193c0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
193d0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
193e0 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
193f0 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
19400 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19410 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28  _BKPT;..    for(
19420 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
19430 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
19440 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
19450 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
19460 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
19470 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20  t, nFin, iFree, 
19480 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
19490 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
194a0 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
194b0 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
194c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
194d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
194e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
194f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
19500 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19510 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
19520 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
19530 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
19540 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
19550 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19560 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19570 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
19580 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
19590 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cate = 1;.      
195a0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69  pBt->nPage = nFi
195b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
195c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
195d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
195e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
195f0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
19600 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
19610 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
19620 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
19630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19640 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66  .#else /* ifndef
19650 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19660 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66  OVACUUM */.# def
19670 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d  ine setChildPtrm
19680 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  aps(x) SQLITE_OK
19690 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
196a0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
196b0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
196c0 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
196d0 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
196e0 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
196f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
19700 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
19710 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
19720 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
19730 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
19740 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
19750 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
19760 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
19770 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
19780 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
19790 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
197a0 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
197b0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
197c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
197d0 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
197e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
197f0 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
19800 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
19810 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
19820 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
19830 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
19840 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
19850 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
19860 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
19870 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
19880 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
19890 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
198a0 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
198b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
198c0 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
198d0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
198e0 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
198f0 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
19900 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
19910 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
19920 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
19930 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19940 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
19950 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
19960 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
19970 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
19980 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
19990 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
199a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
199b0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
199c0 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
199d0 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
199e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
199f0 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
19a00 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
19a10 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
19a20 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
19a30 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
19a40 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
19a50 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
19a60 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
19a70 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
19a80 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
19a90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19aa0 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
19ab0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
19ac0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
19ad0 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
19ae0 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
19af0 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
19b00 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
19b10 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
19b20 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
19b30 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
19b40 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
19b50 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
19b60 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
19b70 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
19b80 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
19b90 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
19ba0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
19bb0 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
19bc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19bd0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
19be0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
19bf0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
19c00 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
19c10 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
19c20 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
19c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19c40 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19c50 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
19c60 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
19c70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
19c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19c90 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
19ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19cb0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
19cc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
19ce0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
19cf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19d20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
19d30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19d50 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
19d60 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
19d70 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
19d80 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
19d90 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
19da0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
19db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19dc0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
19dd0 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
19de0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
19df0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19e00 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
19e10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19e20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19e30 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
19e40 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
19e50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
19e60 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
19e70 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
19e80 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
19e90 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
19ea0 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
19eb0 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
19ec0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
19ed0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
19ee0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
19ef0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
19f00 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
19f10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19f20 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
19f30 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
19f40 69 66 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48  if.  btreeClearH
19f50 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
19f60 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19f70 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  >TRANS_NONE && p
19f80 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ->db->activeVdbe
19f90 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Cnt>1 ){.    /* 
19fa0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
19fb0 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
19fc0 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
19fd0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
19fe0 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
19ff0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
1a000 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1a010 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
1a020 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
1a030 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
1a040 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
1a050 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
1a060 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
1a070 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1a080 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
1a090 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1a0a0 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1a0b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
1a0c0 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
1a0d0 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
1a0e0 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
1a0f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
1a100 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
1a110 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
1a120 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
1a130 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
1a140 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
1a150 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1a160 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1a170 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
1a180 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
1a190 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
1a1a0 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
1a1b0 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
1a1c0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
1a1d0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1a1e0 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
1a1f0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1a200 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
1a210 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
1a220 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
1a230 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
1a240 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
1a250 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1a260 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
1a270 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1a280 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
1a290 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
1a2a0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
1a2b0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
1a2c0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
1a2d0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
1a2e0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
1a2f0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1a300 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
1a310 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1a320 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
1a330 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1a340 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1a350 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
1a360 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
1a370 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
1a380 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
1a390 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1a3a0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
1a3b0 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
1a3c0 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
1a3d0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
1a3e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a3f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
1a400 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1a410 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
1a420 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
1a430 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
1a440 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1a450 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
1a460 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1a470 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
1a480 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
1a490 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
1a4a0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
1a4b0 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
1a4c0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1a4d0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
1a4e0 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
1a4f0 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
1a500 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
1a510 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
1a520 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
1a530 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
1a540 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
1a550 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
1a560 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
1a570 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
1a580 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
1a590 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
1a5a0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
1a5b0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
1a5c0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
1a5d0 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
1a5e0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
1a5f0 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
1a600 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
1a610 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
1a620 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
1a630 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
1a640 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
1a650 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
1a660 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
1a670 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
1a680 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
1a690 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
1a6a0 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
1a6b0 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
1a6c0 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
1a6d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
1a6e0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
1a6f0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
1a700 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
1a710 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
1a720 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
1a730 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
1a740 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1a750 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
1a760 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1a770 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
1a780 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1a790 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
1a7a0 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
1a7b0 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
1a7c0 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
1a7d0 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
1a7e0 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
1a7f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1a800 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
1a810 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
1a820 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
1a830 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
1a840 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
1a850 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
1a860 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1a870 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1a880 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a890 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1a8a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1a8b0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1a8c0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1a8d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1a8e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a8f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1a900 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
1a910 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
1a920 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a930 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
1a940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
1a950 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a960 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1a970 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1a980 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
1a990 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1a9a0 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
1a9b0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
1a9c0 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
1a9d0 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
1a9e0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1a9f0 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
1aa00 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1aa10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1aa20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1aa30 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1aa40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1aa50 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1aa60 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1aa70 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
1aa80 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
1aa90 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
1aaa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1aab0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
1aac0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1aad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aae0 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
1aaf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1ab00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ab10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ab20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
1ab30 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1ab40 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1ab50 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1ab60 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1ab70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ab80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
1ab90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1aba0 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
1abb0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
1abc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1abd0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
1abe0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1abf0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ac00 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1ac10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ac20 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1ac30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ac40 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1ac50 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1ac60 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1ac70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1ac80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1ac90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1aca0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1acb0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1acc0 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
1acd0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
1ace0 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
1acf0 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
1ad00 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
1ad10 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
1ad20 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
1ad30 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
1ad40 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
1ad50 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
1ad60 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1ad70 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  , a write-cursor
1ad80 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
1ad90 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
1ada0 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20  e of writing to 
1adb0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68  the databse.  Th
1adc0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  at means the cur
1add0 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69  sor was.** origi
1ade0 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  nally opened for
1adf0 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65   writing and the
1ae00 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
1ae10 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62  be disabled.** b
1ae20 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61  y having its sta
1ae30 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55  te changed to CU
1ae40 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73  RSOR_FAULT..*/.s
1ae50 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
1ae60 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
1ae70 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
1ae80 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
1ae90 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
1aea0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
1aeb0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
1aec0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
1aed0 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
1aee0 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  g && pCur->eStat
1aef0 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1af00 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1af10 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1af20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1af30 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1af40 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1af50 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1af60 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1af70 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1af80 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
1af90 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
1afa0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
1afb0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
1afc0 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
1afd0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
1afe0 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
1aff0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1b000 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1b010 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
1b020 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
1b030 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
1b040 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b050 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
1b060 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
1b070 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
1b080 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
1b090 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
1b0a0 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
1b0b0 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
1b0c0 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
1b0d0 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
1b0e0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
1b0f0 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
1b100 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
1b110 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
1b120 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
1b130 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
1b140 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
1b150 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1b160 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
1b170 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
1b180 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
1b190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1b1a0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1b1b0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1b1c0 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
1b1d0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1b1e0 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20  if( pBtree==0 ) 
1b1f0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1b200 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1b210 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
1b220 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
1b230 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1b240 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1b250 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1b260 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
1b270 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
1b280 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
1b290 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
1b2a0 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69  rCode;.    for(i
1b2b0 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
1b2c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1b2d0 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
1b2e0 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  ge[i]);.      p-
1b2f0 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
1b300 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1b310 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1b320 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
1b330 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
1b340 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
1b350 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
1b360 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
1b370 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
1b380 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
1b390 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
1b3a0 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
1b3b0 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
1b3c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
1b3d0 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
1b3e0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
1b3f0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
1b400 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1b410 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1b420 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b430 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1b440 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1b450 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1b460 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1b470 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1b480 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
1b490 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69  back(Btree *p, i
1b4a0 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
1b4b0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1b4c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b4d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1b4e0 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
1b4f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b500 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
1b510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1b520 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
1b530 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1b540 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  t, 0, 0);.  }els
1b550 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1b560 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1b570 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
1b580 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1b590 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
1b5a0 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20  ripCode);.  }.  
1b5b0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1b5c0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
1b5d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1b5e0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
1b5f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
1b600 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
1b610 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1b620 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
1b630 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1b640 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1b650 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
1b660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b670 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
1b680 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
1b690 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
1b6a0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
1b6b0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
1b6c0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
1b6d0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
1b6e0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
1b6f0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
1b700 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
1b710 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
1b720 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
1b730 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1b740 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
1b750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b760 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
1b770 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
1b780 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1b790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b7a0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
1b7b0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1b7c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1b7d0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1b7e0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1b7f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
1b800 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
1b810 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1b820 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
1b830 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1b840 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
1b850 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
1b860 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
1b870 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
1b880 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1b890 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
1b8a0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1b8b0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1b8c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b8d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b8e0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1b8f0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1b900 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1b910 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1b920 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
1b930 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
1b940 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
1b950 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
1b960 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
1b970 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
1b980 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
1b990 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1b9a0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1b9b0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
1b9c0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
1b9d0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1b9e0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
1b9f0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
1ba00 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
1ba10 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
1ba20 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
1ba30 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
1ba40 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
1ba50 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
1ba60 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
1ba70 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
1ba80 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
1ba90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
1baa0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
1bab0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
1bac0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
1bad0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
1bae0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
1baf0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1bb00 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
1bb10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1bb20 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
1bb30 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
1bb40 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1bb50 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
1bb60 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
1bb70 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1bb80 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1bb90 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
1bba0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
1bbb0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
1bbc0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
1bbd0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1bbe0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
1bbf0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
1bc00 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1bc10 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
1bc20 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
1bc30 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
1bc40 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
1bc50 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
1bc60 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
1bc70 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
1bc80 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
1bc90 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
1bca0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1bcb0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
1bcc0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1bcd0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1bce0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
1bcf0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
1bd00 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1bd10 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1bd20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1bd30 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1bd40 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
1bd50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1bd60 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
1bd70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1bd80 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
1bd90 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1bda0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1bdb0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1bdc0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1bdd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1bde0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1bdf0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1be00 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1be10 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1be20 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1be30 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1be40 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1be50 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1be60 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1be70 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1be80 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1be90 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1bea0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1beb0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1bec0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1bed0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1bee0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1bef0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1bf00 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1bf10 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1bf20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1bf30 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1bf40 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1bf50 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1bf60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bf70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf80 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1bf90 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1bfa0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1bfb0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1bfc0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1bfd0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1bfe0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1bff0 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1c000 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1c010 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1c020 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1c030 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1c040 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1c050 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1c060 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1c070 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1c080 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1c090 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1c0a0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1c0b0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1c0c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1c0d0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1c0e0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1c0f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1c100 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1c110 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1c120 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1c130 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1c140 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1c150 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1c160 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1c170 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1c180 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1c190 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1c1a0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1c1b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c1c0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1c1d0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1c1e0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1c1f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c200 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1c210 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c220 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1c230 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1c240 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1c250 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1c260 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1c270 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1c280 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c290 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1c2a0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1c2b0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1c2c0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1c2d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1c2e0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1c2f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1c300 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1c310 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1c320 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1c330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c340 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1c350 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
1c360 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
1c370 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
1c380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
1c390 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
1c3a0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1c3b0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1c3c0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1c3d0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1c3e0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
1c3f0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
1c400 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
1c410 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
1c420 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
1c430 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
1c440 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
1c450 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1c460 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
1c470 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
1c480 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
1c490 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
1c4a0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
1c4b0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
1c4c0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
1c4d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c4e0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1c4f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1c500 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1c510 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1c520 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1c530 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1c540 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1c550 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1c560 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1c570 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1c580 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1c590 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1c5a0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1c5b0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1c5c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c5d0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1c5e0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1c5f0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1c600 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1c610 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1c620 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1c630 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1c640 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1c650 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1c660 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1c670 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1c680 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1c690 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1c6a0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1c6b0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1c6c0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1c6d0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1c6e0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1c6f0 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1c700 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1c710 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1c720 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1c730 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1c740 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1c750 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1c760 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1c770 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1c780 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1c790 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1c7a0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1c7b0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1c7c0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1c7d0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1c7e0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1c7f0 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1c800 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1c810 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1c820 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1c830 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1c840 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1c850 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1c860 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1c870 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1c880 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1c890 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1c8a0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1c8b0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1c8c0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1c8d0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1c8e0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1c8f0 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1c900 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1c910 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1c920 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1c930 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1c940 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1c950 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1c960 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1c970 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1c980 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1c990 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1c9a0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1c9b0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1c9c0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1c9d0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1c9e0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1c9f0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1ca00 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1ca10 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1ca20 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1ca30 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1ca40 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1ca50 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1ca60 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1ca70 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1ca80 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1ca90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1cac0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1caf0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1cb00 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1cb10 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb30 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1cb40 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1cb50 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1cb60 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1cb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cb80 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1cb90 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1cba0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1cbb0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1cbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1cbd0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1cbe0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1cbf0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1cc00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1cc10 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1cc20 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1cc30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1cc40 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1cc50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1cc60 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1cc70 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1cc80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1cc90 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1cca0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1ccb0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1ccc0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1ccd0 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1cce0 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1ccf0 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1cd00 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1cd10 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1cd20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1cd30 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1cd40 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1cd50 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1cd60 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1cd70 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1cd80 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1cd90 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1cda0 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1cdb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1cdc0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1cdd0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1cde0 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1cdf0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1ce00 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1ce10 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1ce20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1ce30 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1ce40 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1ce50 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1ce60 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1ce70 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ce80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1ce90 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1cea0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1ceb0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1cec0 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e  wrFlag && (pBt->
1ced0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1cee0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b  EAD_ONLY)!=0) ){
1cef0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cf00 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1cf10 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1cf20 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1cf30 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1cf40 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1cf50 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
1cf60 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1cf70 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1cf80 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1cf90 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1cfa0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1cfb0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1cfc0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1cfd0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1cfe0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1cff0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1d000 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1d010 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1d020 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1d030 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1d040 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1d050 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1d060 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1d070 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1d080 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1d090 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1d0a0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1d0b0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1d0c0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1d0d0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1d0e0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1d0f0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1d100 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1d110 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1d120 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1d130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d140 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1d150 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1d160 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d190 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1d1a0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1d1d0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1d1e0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1d1f0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d210 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1d220 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1d230 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1d240 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1d250 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1d260 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1d270 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1d280 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1d290 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1d2c0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1d2d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1d2e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1d2f0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1d300 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1d310 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1d320 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1d330 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1d340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d350 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1d360 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1d370 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1d380 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1d390 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1d3a0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1d3b0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1d3c0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1d3d0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1d3e0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1d3f0 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1d400 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1d410 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1d420 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1d430 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1d440 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1d450 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1d460 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1d470 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d480 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1d490 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
1d4a0 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
1d4b0 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
1d4c0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1d4d0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
1d4e0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
1d4f0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
1d500 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
1d510 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
1d520 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
1d530 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
1d540 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
1d550 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
1d560 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
1d570 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
1d580 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
1d590 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
1d5a0 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
1d5b0 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
1d5c0 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
1d5d0 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
1d5e0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
1d5f0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
1d600 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
1d610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1d620 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
1d630 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
1d640 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
1d650 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
1d660 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
1d670 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72  Set the cached r
1d680 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76  owid value of ev
1d690 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68  ery cursor in th
1d6a0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1d6b0 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20  file.** as pCur 
1d6c0 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73  and having the s
1d6d0 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  ame root page nu
1d6e0 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54  mber as pCur.  T
1d6f0 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  he value is.** s
1d700 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a  et to iRowid..**
1d710 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76  .** Only positiv
1d720 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61  e rowid values a
1d730 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61  re considered va
1d740 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63  lid for this cac
1d750 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65  he..** The cache
1d760 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1d770 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74  to zero, indicat
1d780 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63  ing an invalid c
1d790 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65  ache..** A btree
1d7a0 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20   will work fine 
1d7b0 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67  with zero or neg
1d7c0 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57  ative rowids.  W
1d7d0 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a  e just cannot.**
1d7e0 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e   cache zero or n
1d7f0 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20  egative rowids, 
1d800 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c  which means tabl
1d810 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f  es that use zero
1d820 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20   or.** negative 
1d830 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e  rowids might run
1d840 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
1d850 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69  .  But in practi
1d860 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e  ce, zero.** or n
1d870 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61  egative rowids a
1d880 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e  re very uncommon
1d890 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20   so this should 
1d8a0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
1d8b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d8c0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
1d8d0 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1d8e0 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Cur, sqlite3_int
1d8f0 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74  64 iRowid){.  Bt
1d900 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
1d910 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43  (p=pCur->pBt->pC
1d920 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1d930 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1d940 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72  ->pgnoRoot==pCur
1d950 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e  ->pgnoRoot ) p->
1d960 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52  cachedRowid = iR
1d970 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  owid;.  }.  asse
1d980 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64  rt( pCur->cached
1d990 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b  Rowid==iRowid );
1d9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d9b0 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1d9c0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1d9d0 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74  cursor.  A negat
1d9e0 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72  ive or zero.** r
1d9f0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1da00 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72  cates that the r
1da10 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e  owid cache is in
1da20 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
1da30 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   be.** ignored. 
1da40 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61   If the rowid ca
1da50 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  che has never be
1da60 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74  fore been set, t
1da70 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73  hen a.** zero is
1da80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71   returned..*/.sq
1da90 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1daa0 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1dab0 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1dac0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1dad0 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1dae0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  id;.}../*.** Clo
1daf0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
1db00 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
1db10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1db20 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
1db30 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
1db40 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1db50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1db60 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
1db70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1db80 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
1db90 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1dba0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1dbb0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
1dbc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1dbd0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
1dbe0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dbf0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
1dc00 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1dc10 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
1dc20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
1dc30 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1dc40 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
1dc50 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1dc60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
1dc70 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
1dc80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1dc90 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1dca0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1dcb0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1dcc0 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
1dcd0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1dce0 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1dcf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1dd00 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1dd10 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1dd20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1dd30 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1dd40 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1dd50 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
1dd60 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1dd70 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
1dd80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1dd90 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1dda0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ddb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1ddc0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
1ddd0 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
1dde0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
1ddf0 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
1de00 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
1de10 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
1de20 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
1de30 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
1de40 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
1de50 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
1de60 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
1de70 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
1de80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1de90 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
1dea0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
1deb0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
1dec0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
1ded0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
1dee0 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1def0 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1df00 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1df10 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1df20 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1df30 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1df40 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1df50 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1df60 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1df70 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1df80 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1df90 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1dfa0 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1dfb0 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1dfc0 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1dfd0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1dfe0 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1dff0 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1e000 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1e010 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1e020 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1e030 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1e040 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1e050 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1e060 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1e070 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1e080 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1e090 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1e0a0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1e0b0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1e0c0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1e0d0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1e0e0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1e0f0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1e100 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1e110 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
1e120 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1e130 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1e140 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1e150 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1e160 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1e170 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1e180 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1e190 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1e1a0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1e1b0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1e1c0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1e1d0 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1e1e0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1e1f0 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1e200 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1e210 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1e220 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1e230 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1e240 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1e250 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1e260 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1e270 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1e280 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
1e290 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1e2a0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1e2b0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1e2c0 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1e2d0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
1e2e0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
1e2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e300 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1e310 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
1e320 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
1e330 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
1e340 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
1e350 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
1e360 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
1e370 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
1e380 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
1e390 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
1e3e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1e3f0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e420 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
1e430 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1e440 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
1e480 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1e490 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1e4a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1e4b0 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1e4c0 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
1e4d0 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e510 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
1e570 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
1e5c0 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
1e5d0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
1e5e0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
1e5f0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
1e600 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1e610 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
1e620 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1e630 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
1e640 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
1e650 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
1e660 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
1e670 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1e680 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
1e690 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
1e6a0 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
1e6b0 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
1e6c0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
1e6d0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1e6e0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
1e6f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e700 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1e710 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e720 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
1e730 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
1e740 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
1e750 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
1e760 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
1e770 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1e780 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1e790 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1e7a0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1e7b0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1e7c0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1e7d0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1e7e0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1e7f0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1e800 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1e810 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1e820 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1e830 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1e840 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1e850 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1e860 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1e870 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1e880 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1e890 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1e8a0 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
1e8b0 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
1e8c0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1e8d0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
1e8e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1e8f0 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
1e900 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1e910 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
1e920 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1e930 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
1e940 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
1e950 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1e960 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e970 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1e980 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e990 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1e9a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e9b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1e9c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1e9d0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
1e9e0 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
1e9f0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ea00 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1ea10 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
1ea20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1ea30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ea40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ea50 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1ea60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ea70 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1ea80 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1ea90 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1eaa0 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
1eab0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1eac0 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
1ead0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
1eae0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
1eaf0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
1eb00 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
1eb10 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
1eb20 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
1eb30 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
1eb40 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1eb50 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
1eb60 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
1eb70 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
1eb80 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1eb90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
1eba0 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1ebb0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
1ebc0 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
1ebd0 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
1ebe0 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
1ebf0 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
1ec00 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
1ec10 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
1ec20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
1ec30 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
1ec40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ec50 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1ec60 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1ec70 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1ec80 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ec90 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1eca0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1ecb0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1ecc0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1ecd0 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
1ece0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
1ecf0 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ta;.  return SQL
1ed00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ed10 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1ed20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1ed30 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1ed40 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1ed50 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1ed60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1ed70 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1ed80 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1ed90 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1eda0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1edb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1edc0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1edd0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1ede0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1edf0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1ee00 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1ee10 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1ee20 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1ee30 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1ee40 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1ee50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1ee60 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1ee70 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1ee80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1ee90 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1eea0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1eeb0 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1eec0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1eed0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1eee0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1eef0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1ef00 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1ef10 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1ef20 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1ef30 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1ef40 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1ef50 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1ef60 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1ef70 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1ef80 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1ef90 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1efa0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1efb0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1efc0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1efd0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1efe0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1eff0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1f000 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1f010 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1f020 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1f030 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1f040 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1f050 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1f060 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1f070 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1f080 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1f090 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1f0a0 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1f0b0 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1f0c0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1f0d0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1f0e0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1f0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f110 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1f140 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1f150 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1f160 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1f170 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1f180 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1f190 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1f1a0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1f1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f1c0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1f1d0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1f1e0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1f1f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1f200 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1f210 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f220 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f230 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1f240 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1f250 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1f260 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f270 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f280 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1f290 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1f2a0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1f2b0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1f2c0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1f2d0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1f2e0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1f2f0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1f300 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1f310 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1f320 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1f330 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1f340 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1f350 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1f360 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1f370 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1f380 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1f390 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1f3a0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1f3b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1f3c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1f3d0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1f3e0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1f3f0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1f400 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1f410 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1f420 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1f430 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1f440 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f450 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1f460 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1f470 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
1f480 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
1f490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1f4a0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1f4b0 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1f4c0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1f4d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f4e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1f4f0 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1f500 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1f510 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1f520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1f530 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1f540 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1f550 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
1f560 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
1f570 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
1f580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f590 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1f5a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1f5b0 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
1f5c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1f5d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1f5e0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
1f5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f600 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
1f610 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1f620 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1f630 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
1f640 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
1f650 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
1f660 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
1f670 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
1f680 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
1f690 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1f6a0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
1f6b0 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
1f6c0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
1f6d0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
1f6e0 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
1f6f0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
1f700 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
1f710 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
1f720 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
1f730 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
1f740 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
1f750 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
1f760 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
1f770 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
1f780 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
1f790 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
1f7a0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
1f7b0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
1f7c0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
1f7d0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
1f7e0 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1f7f0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
1f800 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
1f810 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
1f820 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
1f830 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
1f840 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
1f850 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f860 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
1f870 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
1f880 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1f890 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
1f8a0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
1f8b0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
1f8c0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
1f8d0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
1f8e0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1f8f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1f900 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
1f910 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
1f920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f930 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1f940 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
1f950 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
1f960 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
1f970 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
1f980 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
1f990 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
1f9a0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
1f9b0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
1f9c0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
1f9d0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
1f9e0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1f9f0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
1fa00 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
1fa10 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
1fa20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fa30 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
1fa40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1fa50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fa60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fa70 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
1fa80 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
1fa90 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
1faa0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1fab0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
1fac0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
1fad0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
1fae0 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
1faf0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
1fb00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fb10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1fb20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1fb30 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
1fb40 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
1fb50 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
1fb60 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1fb70 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
1fb80 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1fb90 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
1fba0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
1fbb0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
1fbc0 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
1fbd0 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
1fbe0 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
1fbf0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
1fc00 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
1fc10 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
1fc20 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
1fc30 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
1fc40 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
1fc50 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
1fc60 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
1fc70 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
1fc80 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
1fc90 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1fca0 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
1fcb0 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
1fcc0 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
1fcd0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
1fce0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
1fcf0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
1fd00 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
1fd10 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
1fd20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
1fd30 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1fd40 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
1fd50 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
1fd60 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
1fd70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
1fd80 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
1fd90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
1fda0 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
1fdb0 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
1fdc0 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
1fdd0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
1fde0 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
1fdf0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1fe00 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
1fe10 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
1fe20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
1fe30 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
1fe40 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
1fe50 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
1fe60 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
1fe70 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1fe80 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1fe90 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
1fea0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1feb0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
1fec0 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
1fed0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
1fee0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
1fef0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
1ff00 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
1ff10 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
1ff20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
1ff30 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
1ff40 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
1ff50 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
1ff60 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1ff70 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
1ff80 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
1ff90 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
1ffa0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
1ffb0 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
1ffc0 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
1ffd0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
1ffe0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
1fff0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
20000 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
20010 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
20020 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
20030 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
20040 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
20050 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
20060 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
20070 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
20080 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
20090 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
200a0 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
200b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
200c0 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
200d0 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
200e0 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
200f0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
20100 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
20110 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20130 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
20140 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
20150 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
20160 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
20170 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20180 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
20190 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
201a0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
201b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
201c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
201d0 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
201e0 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
201f0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
20200 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
20230 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
20240 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
20250 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
20260 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20270 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20280 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20290 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
202a0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
202b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
202c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
202d0 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
202e0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
202f0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
20300 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
20310 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
20320 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
20330 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
20340 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
20350 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45  nKey);..  if( NE
20360 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e  VER(offset+amt >
20370 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
20380 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26  .nData) .   || &
20390 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
203a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
203b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
203c0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29  >usableSize].  )
203d0 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
203e0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
203f0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
20400 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
20410 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
20420 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20430 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
20440 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
20450 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
20460 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
20470 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
20480 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
20490 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
204a0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
204b0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
204c0 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
204d0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
204e0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
204f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
20500 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
20510 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
20520 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
20530 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
20540 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
20550 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
20560 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
20570 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
20580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
20590 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
205a0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
205b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
205c0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
205d0 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
205e0 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
205f0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
20600 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
20610 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
20620 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
20630 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
20640 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
20650 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
20660 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66  o.nLocal]);..#if
20670 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20680 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a  _INCRBLOB.    /*
20690 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c   If the isIncrbl
206a0 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
206b0 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43   set and the BtC
206c0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
206d0 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ].    ** has not
206e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
206f0 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
20700 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73  . The array is s
20710 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f  ized at.    ** o
20720 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
20730 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
20740 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
20750 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a  chain. The.    *
20760 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
20770 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
20780 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72  low page is stor
20790 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
207a0 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20  0],.    ** etc. 
207b0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
207c0 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
207d0 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74  array means "not
207e0 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20   yet known".    
207f0 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73  ** (the cache is
20800 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
20810 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
20820 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
20830 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43  lobHandle && !pC
20840 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
20850 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
20860 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
20870 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
20880 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
20890 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
208a0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
208b0 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29  rflow = (Pgno *)
208c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
208d0 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e  o(sizeof(Pgno)*n
208e0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Ovfl);.      /* 
208f0 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20  nOvfl is always 
20900 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69 74  positive.  If it
20910 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63   were zero, fetc
20920 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68  hPayload would h
20930 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65  ave.      ** bee
20940 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  n used instead o
20950 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  f this routine. 
20960 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
20970 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70  AYS(nOvfl) && !p
20980 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
20990 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
209a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
209b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
209c0 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
209d0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
209e0 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
209f0 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
20a00 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
20a10 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
20a20 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
20a30 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
20a40 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
20a50 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
20a60 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
20a70 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
20a80 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
20a90 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
20aa0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
20ab0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
20ac0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
20ad0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
20ae0 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
20af0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
20b00 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
20b10 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
20b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20b30 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
20b40 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
20b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b60 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
20b70 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
20b80 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
20b90 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
20ba0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
20bb0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
20bc0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
20bd0 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
20be0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
20bf0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20c00 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
20c10 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
20c20 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
20c30 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
20c40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20c50 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
20c60 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
20c70 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
20c80 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
20c90 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
20ca0 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
20cb0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
20cc0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
20cd0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
20ce0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
20cf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
20d00 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
20d10 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
20d20 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
20d30 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
20d40 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
20d50 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
20d60 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
20d70 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
20d80 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
20d90 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
20da0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
20db0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20dc0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
20dd0 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
20de0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
20df0 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
20e00 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
20e10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
20e20 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
20e30 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
20e40 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
20e50 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
20e60 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
20e70 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
20e80 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
20e90 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
20ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
20eb0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
20ec0 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
20ed0 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
20ee0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
20ef0 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
20f00 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
20f10 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
20f20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
20f30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
20f40 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
20f50 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
20f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20f70 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
20f80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
20f90 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
20fa0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
20fb0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
20fc0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
20fd0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
20fe0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
20ff0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
21000 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
21010 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
21020 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
21030 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
21040 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
21050 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
21060 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
21070 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
21080 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
21090 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
210a0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
210b0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
210c0 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
210d0 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
210e0 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
210f0 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
21100 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
21110 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
21120 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
21130 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
21140 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
21150 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
21160 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
21170 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
21180 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
21190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
211a0 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
211b0 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
211c0 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
211d0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
211e0 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
211f0 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
21200 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
21210 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
21220 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
21230 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
21240 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
21250 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20  eOp==0          
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
21290 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
212a0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
212d0 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
212e0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
212f0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21310 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
21320 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
21330 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
21340 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
21350 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
21360 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
21370 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
21380 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31  >aData[19]==0x01
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
213b0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
213c0 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
213d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
213e0 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
213f0 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -4];.          m
21400 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
21410 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
21420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21430 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
21440 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
21450 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
21460 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
21470 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
21480 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
21490 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
214a0 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
214b0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
214c0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
214d0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
214e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
214f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21500 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
21510 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
21520 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
21530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21550 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
21560 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
21570 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
21580 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
21590 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
215a0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
215b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
215c0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
215d0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
215e0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
215f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21600 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
21610 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
21620 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
21630 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
21640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21650 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
21660 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
21670 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
21680 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
21690 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
216a0 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
216b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
216c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
216d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
216e0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
216f0 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
21700 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
21710 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
21720 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
21730 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
21740 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
21750 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
21760 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
21770 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
21780 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
21790 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
217a0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
217b0 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
217c0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
217d0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
217e0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
217f0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
21800 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
21810 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
21820 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
21830 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
21840 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
21850 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
21860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21870 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
21880 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
21890 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
218a0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
218b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
218c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
218d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
218e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
218f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
21900 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
21910 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21920 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
21930 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
21940 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21950 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
21960 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
21970 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
21980 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
21990 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
219a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
219b0 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
219c0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
219d0 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
219e0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
219f0 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
21a00 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
21a10 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
21a20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
21a30 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
21a40 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
21a50 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
21a60 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
21a70 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
21a80 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
21a90 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
21aa0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
21ab0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
21ac0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
21ad0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
21ae0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
21af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21b00 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
21b10 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
21b20 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
21b30 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
21b40 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
21b50 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
21b60 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
21b70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
21b80 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
21b90 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
21ba0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
21bb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21bc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21bd0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
21be0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
21bf0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
21c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21c10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21c20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21c30 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
21c40 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
21c50 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
21c60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
21c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21c80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21c90 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
21ca0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21cb0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
21cc0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
21cd0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
21ce0 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
21cf0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21d00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
21d10 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
21d20 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
21d30 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
21d40 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
21d50 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
21d60 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
21d70 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
21d80 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
21d90 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
21da0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
21db0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
21dc0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
21dd0 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
21de0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
21df0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
21e00 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
21e10 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
21e20 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
21e30 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
21e40 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
21e50 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
21e60 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
21e70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
21e80 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
21e90 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
21ea0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
21eb0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
21ec0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
21ed0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
21ee0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
21ef0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
21f00 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
21f10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
21f20 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
21f30 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
21f40 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
21f50 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
21f60 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
21f70 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
21f80 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
21f90 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
21fa0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
21fb0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
21fc0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
21fd0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
21fe0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
21ff0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
22000 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
22010 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
22020 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
22030 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
22040 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
22050 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22060 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
22070 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
22080 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
22090 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
220a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
220b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
220c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
220d0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
220e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
220f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
22100 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
22110 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
22120 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
22130 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
22150 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
22160 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
22170 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
22180 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
22190 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
221a0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
221b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
221c0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
221d0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
221e0 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
221f0 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
22200 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
22210 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
22220 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22230 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
22240 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22250 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22260 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22270 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22280 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
22290 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
222a0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
222b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
222c0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
222d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
222e0 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66   NEVER(pCur->inf
222f0 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20  o.nSize==0) ){. 
22300 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
22310 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
22320 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75  Cur->iPage], pCu
22330 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22340 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
22350 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d            &pCur-
22360 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50  >info);.  }.  aP
22370 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
22380 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
22390 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
223a0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
223b0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
223c0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
223d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
223e0 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
223f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
22400 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
22410 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
22420 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
22430 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
22440 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
22450 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
22460 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
22470 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72  Local;.    asser
22480 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20  t( nLocal<=nKey 
22490 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
224a0 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
224b0 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
224c0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
224d0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
224e0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
224f0 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
22500 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
22510 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
22520 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
22530 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
22540 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
22550 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
22560 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
22570 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
22580 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
22590 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
225a0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
225b0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
225c0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
225d0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
225e0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
225f0 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
22600 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
22610 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
22620 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
22630 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
22640 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
22650 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
22660 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
22670 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
22680 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
22690 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
226a0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
226b0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
226c0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
226d0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
226e0 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
226f0 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
22700 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
22710 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
22720 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
22730 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
22740 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
22750 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
22760 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22770 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
22780 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
22790 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
227a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
227b0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
227c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
227d0 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
227e0 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
227f0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
22800 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
22810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
22820 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
22830 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
22840 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
22850 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
22860 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
22870 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
22880 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22890 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
228a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
228b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
228c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
228d0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
228e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
228f0 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
22900 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
22910 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
22920 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
22930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
22940 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
22950 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
22960 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
22970 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
22980 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
22990 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
229a0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
229b0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
229c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
229d0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
229e0 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
229f0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
22a00 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
22a10 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
22a20 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
22a30 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
22a40 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
22a50 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
22a60 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
22a70 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
22a80 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
22a90 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
22aa0 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
22ab0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
22ac0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
22ad0 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
22ae0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
22af0 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
22b00 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
22b10 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
22b20 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
22b30 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
22b40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22b50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22b60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
22b70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22b90 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
22ba0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
22bb0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
22bc0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
22bd0 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
22be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22bf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
22c00 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
22c10 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
22c20 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
22c30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
22c40 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
22c50 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
22c60 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
22c70 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
22c80 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
22c90 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
22ca0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
22cb0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
22cc0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
22cd0 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
22ce0 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
22cf0 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
22d00 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
22d10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22d20 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
22d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22d40 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
22d50 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
22d60 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
22d70 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
22d80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
22d90 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
22da0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
22db0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
22dc0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
22dd0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
22de0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
22df0 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
22e00 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
22e10 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
22e20 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
22e30 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
22e40 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
22e50 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
22e60 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
22e70 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
22e80 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
22e90 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
22ea0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
22eb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
22ec0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
22ed0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
22ee0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
22ef0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
22f00 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
22f10 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
22f20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
22f30 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
22f40 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
22f50 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
22f60 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
22f70 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
22f80 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
22f90 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
22fa0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
22fb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
22fc0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
22fd0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
22fe0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
22ff0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
23000 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
23010 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
23020 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
23030 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
23040 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
23050 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
23060 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
23070 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
23080 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
23090 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
230a0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
230b0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
230c0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
230d0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
230e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
230f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23100 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23110 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23120 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23130 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23140 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
23150 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23160 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23170 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
23180 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
23190 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
231a0 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
231b0 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
231c0 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
231d0 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
231e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
231f0 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
23200 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
23210 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
23220 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
23230 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
23240 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
23250 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
23260 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
23270 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
23280 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
23290 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
232a0 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
232b0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
232c0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
232d0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
232e0 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
232f0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
23300 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
23310 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23320 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
23330 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23340 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
23350 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23360 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
23370 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
23380 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
23390 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
233a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
233b0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
233c0 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
233d0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
233e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
233f0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
23400 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
23410 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23420 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23440 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
23450 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
23460 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
23470 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
23480 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
23490 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
234a0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
234b0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
234c0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
234d0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
234e0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
234f0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
23500 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
23510 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
23520 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
23530 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
23540 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
23550 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
23560 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
23570 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
23580 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
23590 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
235a0 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
235b0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
235c0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
235d0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
235e0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
235f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
23600 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
23610 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
23620 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
23630 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
23640 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
23650 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
23660 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
23670 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
23680 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
23690 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
236a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
236b0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
236c0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
236d0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
236e0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
236f0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
23700 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
23710 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
23720 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
23730 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
23740 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
23750 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
23760 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
23770 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
23780 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
23790 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
237a0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
237b0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
237c0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
237d0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
237e0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
237f0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
23800 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
23810 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
23820 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
23830 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
23840 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
23850 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
23860 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
23870 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23880 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
23890 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
238a0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
238b0 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
238c0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
238d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
238e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
238f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23900 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
23910 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
23920 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
23930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
23940 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
23950 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
23960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
23970 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
23980 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
23990 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
239a0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
239b0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
239c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
239d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
239e0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
239f0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
23a00 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
23a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
23a20 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
23a30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
23a40 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
23a50 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
23a60 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
23a70 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23a80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
23a90 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
23aa0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
23ab0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
23ac0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i]);.    }.    p
23ad0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
23ae0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
23af0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
23b00 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
23b10 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
23b20 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
23b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
23b40 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
23b50 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
23b60 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
23b70 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
23b80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23b90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ba0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
23bb0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
23bc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
23be0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  ->iPage = 0;..  
23bf0 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
23c00 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
23c10 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
23c20 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
23c30 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20  this cursor.    
23c40 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
23c50 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
23c60 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
23c70 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
23c80 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  o is.    ** NULL
23c90 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
23ca0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
23cb0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
23cc0 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
23cd0 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
23ce0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
23cf0 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ror.  */.    ass
23d00 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23d10 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  e[0]->intKey==1 
23d20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
23d30 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  0]->intKey==0 );
23d40 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
23d50 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43  pKeyInfo==0)!=pC
23d60 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
23d70 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
23d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23d90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
23da0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72  .  }..  /* Asser
23db0 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20  t that the root 
23dc0 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20 63  page is of the c
23dd0 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68 69  orrect type. Thi
23de0 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20  s must be the.  
23df0 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20 63  ** case as the c
23e00 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
23e10 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64  tion that loaded
23e20 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28   the root-page (
23e30 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73  either.  ** this
23e40 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69   call or a previ
23e50 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20  ous invocation) 
23e60 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
23e70 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a  ted corruption .
23e80 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75    ** if the assu
23e90 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  mption were not 
23ea0 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20  true, and it is 
23eb0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
23ec0 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a   the flags .  **
23ed0 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62 65   byte to have be
23ee0 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c  en modified whil
23ef0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73  e this cursor is
23f00 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
23f10 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ence.  ** to the
23f20 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f   page.  */.  pRo
23f30 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
23f40 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
23f50 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
23f60 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20  r->pgnoRoot );. 
23f70 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
23f80 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d  isInit && (pCur-
23f90 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70  >pKeyInfo==0)==p
23fa0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Root->intKey );.
23fb0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
23fc0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
23fd0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23fe0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
23ff0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
24000 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28  NKey = 0;..  if(
24010 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
24020 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
24030 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
24040 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
24050 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
24060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24070 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
24080 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
24090 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
240a0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
240b0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
240c0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
240d0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
240e0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
240f0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
24100 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
24110 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d  State = ((pRoot-
24120 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
24130 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
24140 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65  VALID);.  }.  re
24150 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24160 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
24170 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
24180 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
24190 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
241a0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
241b0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
241c0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
241d0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
241e0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
241f0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
24200 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
24210 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
24220 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
24230 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
24240 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
24250 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
24260 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
24270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
24280 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
24290 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
242a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
242b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
242c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
242d0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
242e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
242f0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
24300 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24310 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
24320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24330 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24340 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
24350 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
24360 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24370 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
24380 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24390 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
243a0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
243b0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
243c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
243d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
243e0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
243f0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
24400 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
24410 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
24420 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
24430 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
24440 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
24450 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
24460 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
24470 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
24480 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
24490 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
244a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
244b0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
244c0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
244d0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
244e0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
244f0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
24500 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
24510 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
24520 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
24530 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
24540 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
24550 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
24560 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
24570 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
24580 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
24590 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
245a0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
245b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
245c0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
245d0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
245e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
245f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24600 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24610 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24620 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
24630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24640 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
24650 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24660 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
24670 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
24680 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
24690 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
246a0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
246b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
246c0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
246d0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
246e0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
246f0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
24700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24710 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
24720 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
24730 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
24740 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
24750 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
24760 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
24770 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
24780 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
24790 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
247a0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
247b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
247c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
247d0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
247e0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
247f0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
24800 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
24810 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
24820 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
24830 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
24840 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
24850 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
24860 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
24870 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
24880 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
24890 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
248a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
248b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
248c0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
248d0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
248e0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
248f0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
24900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24910 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
24920 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
24930 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
24940 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
24950 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
24960 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24970 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
24980 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
24990 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
249a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
249b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
249c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
249d0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
249e0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
249f0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
24a00 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
24a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24a20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
24a30 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
24a40 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
24a50 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
24a60 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
24a70 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
24a80 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
24a90 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
24aa0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
24ab0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
24ac0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
24ad0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
24ae0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
24af0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
24b00 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
24b10 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
24b20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24b30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24b40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24b50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
24b60 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
24b70 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
24b80 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
24b90 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
24ba0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
24bb0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
24bc0 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
24bd0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
24be0 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61  te && pCur->atLa
24bf0 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  st ){.#ifdef SQL
24c00 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
24c10 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
24c20 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
24c30 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
24c40 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
24c50 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
24c60 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
24c70 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
24c80 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
24c90 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
24ca0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
24cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24cc0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
24cd0 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
24ce0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
24cf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24d00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24d10 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
24d20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24d30 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
24d40 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
24d50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24d60 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
24d70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24d80 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
24d90 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
24da0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
24db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24dc0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
24dd0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
24de0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
24df0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
24e00 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
24e10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24e20 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
24e30 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
24e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
24e50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
24e60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24e70 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
24e80 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
24e90 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
24ea0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
24eb0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
24ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b  =SQLITE_OK ?1:0;
24ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24ee0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
24ef0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
24f00 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
24f10 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
24f20 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
24f30 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
24f40 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
24f50 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
24f60 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
24f70 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
24f80 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
24f90 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
24fa0 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
24fb0 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
24fc0 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
24fd0 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
24fe0 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
24ff0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
25000 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
25010 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
25020 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
25030 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
25040 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
25050 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
25060 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
25070 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
25080 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
25090 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
250a0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
250b0 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
250c0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
250d0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
250e0 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
250f0 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
25100 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
25110 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
25120 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
25130 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
25140 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
25150 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
25160 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
25170 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
25180 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
25190 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
251a0 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
251b0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
251c0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
251d0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
25200 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
25210 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
25220 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
25240 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
25250 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
25260 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
25270 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
25280 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
25290 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
252a0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
252b0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
252c0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
252d0 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
252e0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
252f0 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
25300 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25310 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25320 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
25350 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
25360 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
25370 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
25380 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
25390 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
253a0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
253b0 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
253c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
253d0 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
253e0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
253f0 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25410 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
25420 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
25430 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
25440 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
25450 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
25460 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
25470 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
25480 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
25490 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
254a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
254b0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
254c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
254d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
254e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
254f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
25500 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
25510 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
25520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
25530 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
25540 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
25550 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
25560 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
25570 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
25580 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
25590 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
255a0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
255b0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
255c0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
255d0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
255e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
255f0 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
25600 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
25610 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
25620 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
25630 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
25640 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
25650 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
25660 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25670 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
25680 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
25690 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
256a0 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
256b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
256c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
256d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
256e0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
256f0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
25700 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
25710 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
25720 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25730 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25740 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25750 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
25760 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
25770 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
25780 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25790 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
257a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
257b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
257c0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
257d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
257e0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
257f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
25800 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
25810 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
25820 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
25830 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
25840 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25850 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25860 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
25870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25880 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25890 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
258a0 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
258b0 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
258c0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
258d0 2c 20 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f 20  , idx;.    Pgno 
258e0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
258f0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
25900 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25910 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
25920 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  c;..    /* pPage
25930 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
25940 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
25950 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
25960 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
25970 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
25980 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
25990 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
259a0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
259b0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
259c0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
259d0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
259e0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
259f0 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
25a00 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
25a10 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
25a20 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
25a30 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
25a40 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
25a50 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
25a60 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
25a70 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
25a80 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
25a90 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
25aa0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
25ab0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
25ac0 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
25ad0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
25ae0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
25af0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
25b00 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
25b10 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
25b20 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
25b30 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
25b40 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
25b50 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
25b60 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
25b70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
25b80 20 28 75 31 36 29 28 69 64 78 20 3d 20 75 70 72   (u16)(idx = upr
25b90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25ba0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25bb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
25bc0 75 31 36 29 28 69 64 78 20 3d 20 28 75 70 72 2b  u16)(idx = (upr+
25bd0 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
25be0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
25bf0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
25c20 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
25c30 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
25c40 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3d      assert( idx=
25c50 3d 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  =pCur->aiIdx[pCu
25c60 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
25c70 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
25c80 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
25c90 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
25ca0 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
25cb0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
25cc0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e;.      if( pPa
25cd0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
25ce0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
25cf0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
25d00 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
25d10 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
25d20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
25d30 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
25d40 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
25d50 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
25d60 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
25d70 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
25d80 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
25d90 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
25da0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25db0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
25dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
25dd0 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
25de0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
25df0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25e00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
25e10 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
25e20 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
25e30 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
25e40 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  }.        pCur->
25e50 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
25e60 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
25e70 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
25e80 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
25e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
25ea0 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
25eb0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
25ec0 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
25ed0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
25ee0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
25ef0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
25f00 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
25f10 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
25f20 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
25f30 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
25f40 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
25f50 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
25f60 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
25f70 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
25f80 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
25f90 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
25fa0 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
25fb0 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
25fc0 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
25fd0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
25fe0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
25ff0 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
26000 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
26010 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
26020 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
26030 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
26040 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
26050 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
26060 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
26070 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
26080 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
26090 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
260a0 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
260b0 79 74 65 50 61 79 6c 6f 61 64 0a 20 20 20 20 20  ytePayload.     
260c0 20 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c      /* && (pCell
260d0 2b 6e 43 65 6c 6c 29 3c 70 50 61 67 65 2d 3e 61  +nCell)<pPage->a
260e0 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20 20  DataEnd */.     
260f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26100 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
26110 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
26120 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
26130 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
26140 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
26150 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
26160 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
26170 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
26180 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
26190 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
261a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
261b0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
261c0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
261d0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
261e0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
261f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
26200 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
26210 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
26220 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
26230 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
26240 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
26250 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
26260 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
26270 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
26280 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
26290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 26 26 20            /* && 
262a0 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 29 3c  (pCell+nCell+2)<
262b0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
262c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
262d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
262e0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
262f0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
26300 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
26310 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
26320 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
26330 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
26340 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
26350 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26360 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
26370 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
26380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
26390 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
263a0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
263b0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
263c0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
263d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
263e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
263f0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
26400 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
26410 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
26420 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
26430 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
26440 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
26450 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
26460 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
26470 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
26480 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
26490 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
264a0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
264b0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
264c0 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
264d0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
264e0 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
264f0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
26500 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
26510 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
26520 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
26530 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
26540 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
26550 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61           btreePa
26560 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
26570 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
26580 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
26590 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
265a0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
265b0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
265c0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
265d0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a  alloc( nCell );.
265e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
265f0 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
26600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26610 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26620 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
26630 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
26640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26650 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
26660 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
26670 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
26680 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30  har*)pCellKey, 0
26690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
266a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
266b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
266c0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
266d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
266e0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
266f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26700 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
26710 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
26720 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
26730 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
26740 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26750 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
26760 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26770 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
26780 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
26790 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
267a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
267b0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
267c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
267d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
267e0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
267f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26810 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
26820 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
26830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26840 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
26850 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
26860 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
26870 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
26880 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
26890 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
268a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
268b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
268c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
268d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
268e0 36 29 28 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  6)(idx = (lwr+up
268f0 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
26900 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
26910 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
26920 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
26930 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
26940 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
26950 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
26960 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26970 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
26980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
26990 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
269a0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
269b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
269c0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
269d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
269e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
269f0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
26a00 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
26a10 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
26a20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
26a30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26a40 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
26a50 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
26a60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26a70 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
26a80 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
26a90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26aa0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
26ab0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
26ac0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
26ad0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26ae0 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
26af0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
26b00 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
26b10 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
26b20 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
26b30 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
26b40 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
26b50 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
26b60 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
26b70 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
26b80 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
26b90 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
26ba0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
26bb0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
26bc0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
26bd0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
26be0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
26bf0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
26c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
26c10 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
26c20 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
26c30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
26c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
26c50 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
26c60 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
26c70 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
26c80 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
26c90 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
26ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26cb0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
26cc0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
26cd0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
26ce0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
26cf0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26d00 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
26d10 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
26d20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
26d30 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
26d40 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
26d50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
26d60 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
26d70 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
26d80 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
26d90 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
26da0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
26db0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
26dc0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
26dd0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
26de0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
26df0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
26e00 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
26e10 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
26e20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
26e30 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
26e40 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
26e50 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
26e60 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
26e70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
26e80 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
26e90 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
26ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
26eb0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
26ec0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
26ed0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
26ee0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
26ef0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
26f00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26f10 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
26f20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
26f30 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
26f40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26f50 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
26f60 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
26f70 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69  ( pRes!=0 );.  i
26f80 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
26f90 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
26fa0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
26fb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26fc0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
26fd0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
26fe0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
26ff0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
27000 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27020 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
27030 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
27040 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
27050 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27060 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
27070 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27080 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
27090 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
270a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
270b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
270c0 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
270d0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
270e0 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
270f0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
27100 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
27110 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
27120 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
27130 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
27140 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
27150 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
27160 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
27170 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
27180 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
27190 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
271a0 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
271b0 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
271c0 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
271d0 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
271e0 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
271f0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
27200 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
27210 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
27220 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
27230 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
27240 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
27250 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
27260 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
27270 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
27280 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
27290 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
272a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
272b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
272c0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
272d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
272e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
272f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
27300 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
27310 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
27320 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
27330 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
27340 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
27350 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
27360 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
27370 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
27380 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
27390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
273a0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
273b0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
273c0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
273d0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
273e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
273f0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
27400 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27410 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
27420 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
27430 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
27440 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
27450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
27460 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
27470 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
27480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27490 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
274a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
274b0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
274c0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
274d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
274e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
274f0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
27500 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
27510 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
27520 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
27530 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
27540 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
27550 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27560 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
27570 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
27580 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
27590 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
275a0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
275b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
275c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
275d0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
275e0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
275f0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
27600 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
27610 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
27620 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27630 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
27640 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
27650 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
27660 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27670 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27680 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
27690 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
276a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
276b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
276c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
276d0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
276e0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
276f0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
27700 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
27710 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
27720 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27730 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
27740 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  ext<0 ){.    pCu
27750 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
27760 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
27770 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27780 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
27790 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
277a0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
277b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
277c0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
277d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
277e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
277f0 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
27800 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
27810 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27820 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
27830 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
27840 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
27850 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
27860 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
27870 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
27880 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
27890 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
278a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
278b0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
278c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
278d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
278e0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
278f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
27900 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
27910 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
27920 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
27930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27940 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
27950 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
27960 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
27970 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
27980 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
27990 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
279a0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
279b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
279c0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
279d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
279e0 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
279f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
27a00 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
27a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27a20 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
27a30 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
27a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
27a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
27a60 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
27a70 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
27a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
27a90 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
27aa0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
27ab0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
27ac0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
27ad0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
27ae0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
27af0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27b00 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
27b10 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
27b20 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
27b30 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
27b40 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
27b50 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
27b60 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
27b70 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
27b80 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
27b90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
27ba0 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
27bb0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
27bc0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
27bd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27be0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
27bf0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
27c00 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
27c10 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
27c20 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
27c30 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
27c40 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
27c50 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
27c60 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
27c70 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
27c80 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
27c90 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
27ca0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
27cb0 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
27cc0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
27cd0 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
27ce0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
27cf0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
27d00 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
27d10 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
27d20 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
27d30 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
27d40 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
27d50 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
27d60 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
27d70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27d80 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
27d90 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
27da0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
27db0 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
27dc0 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
27dd0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
27de0 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
27df0 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
27e00 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
27e10 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
27e20 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
27e30 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
27e40 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
27e50 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
27e60 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
27e70 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
27e80 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
27e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27ea0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
27eb0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
27ec0 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
27ed0 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
27ee0 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
27ef0 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 4d   nearby,.  u8 eM
27f00 6f 64 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  ode.){.  MemPage
27f10 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
27f20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
27f30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
27f40 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
27f50 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
27f60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27f70 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
27f80 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
27f90 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
27fa0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
27fb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
27fc0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
27fd0 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
27fe0 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
27ff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28000 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
28010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28020 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
28030 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
28040 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
28050 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
28060 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
28070 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28080 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
28090 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
280a0 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
280b0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
280c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
280d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
280e0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
280f0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
28100 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
28110 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
28120 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
28130 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
28140 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
28150 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
28160 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
28170 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
28180 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
28190 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
281a0 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
281b0 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
281c0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
281d0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
281e0 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
281f0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
28200 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
28210 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
28220 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
28230 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
28240 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
28250 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
28260 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28270 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
28280 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
28290 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
282a0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
282b0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
282c0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
282d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
282e0 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
282f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
28300 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
28310 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28320 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
28330 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
28340 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
28350 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28360 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
28370 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
28380 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
28390 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
283a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
283b0 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
283c0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
283d0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
283e0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
283f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
28400 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
28410 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
28420 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
28430 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
28440 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
28450 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
28460 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
28470 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
28480 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
28490 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
284a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
284b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
284c0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
284d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
284e0 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
284f0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
28500 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
28510 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
28520 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
28530 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
28540 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
28550 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
28560 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
28570 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
28580 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
28590 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
285a0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
285b0 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
285c0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
285d0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
285e0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
285f0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
28600 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
28610 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
28620 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
28630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28640 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
28650 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28660 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
28670 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
28680 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
28690 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
286a0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
286b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
286c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
286d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
286e0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
286f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
28700 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
28710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28720 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28730 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
28740 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28750 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28760 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
28770 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
28780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28790 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
287a0 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
287b0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
287c0 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
287d0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
287e0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
287f0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
28800 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
28810 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28820 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
28830 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
28840 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
28850 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
28860 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
28870 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
28880 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
28890 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
288a0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
288b0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
288c0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
288d0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
288e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
288f0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
28900 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
28910 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28920 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28930 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28950 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
28960 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
28970 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
28980 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
28990 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
289a0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
289b0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
289c0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
289d0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
289e0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
289f0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
28a00 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
28a10 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
28a20 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
28a30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
28a40 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
28a50 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
28a60 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
28a70 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
28a80 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
28a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
28aa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
28ab0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28ac0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
28ad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28ae0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
28af0 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
28b00 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
28b10 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
28b20 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
28b30 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
28b40 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
28b50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
28b60 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
28b70 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
28b80 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
28b90 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
28ba0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
28bb0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
28bc0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
28bd0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
28be0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
28bf0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
28c00 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
28c10 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
28c20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
28c30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28c40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28c50 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
28c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
28c80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28c90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
28ca0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
28cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
28cc0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
28ce0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
28cf0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
28d00 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
28d10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28d20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28d30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28d40 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
28d50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28d60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28d80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28d90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28da0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28db0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
28dc0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
28dd0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
28de0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
28df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28e10 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
28e20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
28e30 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
28e40 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
28e50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
28e60 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
28e70 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
28e80 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
28e90 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
28ea0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
28eb0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
28ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
28ed0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
28ee0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
28ef0 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
28f00 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
28f10 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
28f20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
28f30 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
28f40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
28f50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28f60 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
28f70 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28f80 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28fa0 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
28fb0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
28fc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
28fd0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
28fe0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
28ff0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
29000 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29020 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29030 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29060 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
29070 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
29080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
290a0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
290b0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
290c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
290d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
290e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
290f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
29100 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
29110 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
29120 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
29130 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
29140 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
29150 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
29160 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
29170 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
29180 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
29190 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
291a0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
291b0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
291c0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
291d0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
291e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
291f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
29200 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29210 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
29220 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
29230 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
29240 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
29250 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
29260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29270 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29280 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
29290 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
292a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
292b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
292c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
292d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
292e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
292f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
29300 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
29310 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
29320 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
29330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29340 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
29350 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
29360 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
29370 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
29380 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
29390 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
293a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
293b0 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
293c0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
293d0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
293e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
293f0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
29400 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
29410 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
29420 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
29430 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
29440 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
29450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
29460 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
29470 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
29480 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
29490 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
294a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
294b0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
294c0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
294d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
294e0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
294f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
29500 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
29540 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
29550 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29560 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
29570 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
29580 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
29590 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
295a0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
295b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
295c0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
295d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
295e0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
295f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
29600 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
29610 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
29620 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
29630 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
29640 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
29650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29660 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
29670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
29680 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
29690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
296a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
296b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
296c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
296d0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
296e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
296f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
29700 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
29710 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
29720 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
29730 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
29740 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
29750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
29760 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
29770 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
29780 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29790 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
297a0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
297b0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
297c0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
297d0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
297e0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
297f0 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
29800 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
29810 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
29820 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
29830 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
29840 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
29850 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
29860 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
29870 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
29880 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
29890 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
298c0 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
298d0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
298e0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
298f0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
29900 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
29910 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29920 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
29930 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29940 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29950 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
29960 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
29970 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
29980 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
29990 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
299a0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
299b0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
299c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
299d0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
299e0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
299f0 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
29a00 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
29a10 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
29a20 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
29a30 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
29a40 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
29a50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
29a60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29a80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
29a90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29aa0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
29ab0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29ae0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
29af0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
29b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29b20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
29b30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29b40 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
29b50 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
29b60 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
29b70 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
29b80 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
29b90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29ba0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
29bb0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
29bc0 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
29bd0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
29be0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
29bf0 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
29c00 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
29c10 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
29c20 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
29c30 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
29c40 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
29c50 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
29c60 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
29c70 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
29c80 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
29c90 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
29ca0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
29cb0 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
29cc0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
29cd0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
29ce0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
29cf0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
29d00 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
29d10 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
29d20 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
29d30 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
29d40 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
29d50 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
29d60 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
29d70 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
29d80 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
29d90 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
29da0 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
29db0 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
29dc0 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
29dd0 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
29de0 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
29df0 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
29e00 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
29e10 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
29e20 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
29e30 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
29e40 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
29e50 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
29e60 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
29e70 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
29e80 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
29e90 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
29ea0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
29eb0 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
29ec0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
29ed0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
29ee0 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
29ef0 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
29f00 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
29f10 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
29f20 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
29f30 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
29f40 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
29f50 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
29f60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
29f70 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
29f80 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
29f90 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
29fa0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
29fb0 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
29fc0 74 20 3d 20 28 30 3d 3d 70 42 74 2d 3e 62 44 6f  t = (0==pBt->bDo
29fd0 54 72 75 6e 63 61 74 65 29 3b 0a 0a 20 20 20 20  Truncate);..    
29fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29ff0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
2a000 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2a010 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a020 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
2a030 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
2a040 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2a050 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2a060 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
2a070 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
2a080 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a090 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
2a0a0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
2a0b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
2a0c0 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
2a0d0 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
2a0e0 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
2a0f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2a100 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
2a110 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
2a120 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2a130 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
2a140 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
2a150 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
2a160 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
2a170 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
2a180 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
2a190 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
2a1a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2a1b0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
2a1c0 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
2a1d0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2a1e0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2a1f0 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
2a200 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
2a210 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
2a220 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2a230 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
2a240 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2a250 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
2a260 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2a270 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
2a280 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2a290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a2c0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
2a2d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2a2e0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
2a2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a300 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2a310 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
2a320 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
2a330 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2a340 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2a350 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
2a360 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
2a370 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
2a380 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
2a390 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
2a3a0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
2a3b0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
2a3c0 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
2a3d0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2a3e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2a3f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
2a400 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2a410 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
2a420 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2a430 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2a440 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
2a450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2a460 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2a470 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2a480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a490 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2a4a0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
2a4b0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2a4c0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2a4d0 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
2a4e0 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
2a4f0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2a500 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2a510 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
2a520 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
2a530 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2a540 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2a550 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2a560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a570 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
2a580 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2a590 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
2a5a0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
2a5b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2a5c0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2a5d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a5e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a5f0 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
2a600 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2a610 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
2a620 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ge = 0;.  }.  as
2a630 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2a640 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
2a650 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28  gerIswriteable((
2a660 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2a670 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
2a680 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a690 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2a6a0 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
2a6b0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
2a6c0 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
2a6d0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
2a6e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
2a6f0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2a700 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
2a710 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
2a720 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
2a730 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2a740 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2a750 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
2a760 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
2a770 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
2a780 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
2a790 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
2a7a0 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
2a7b0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
2a7c0 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
2a7d0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
2a7e0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
2a7f0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
2a800 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
2a810 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
2a820 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
2a830 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
2a840 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a850 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
2a860 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
2a870 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
2a880 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
2a890 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2a8a0 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
2a8b0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
2a8c0 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
2a8d0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
2a8e0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2a8f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a900 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
2a910 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
2a920 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a940 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2a950 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
2a960 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
2a970 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2a980 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
2a990 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
2a9a0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2a9b0 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
2a9c0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2a9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2a9e0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
2a9f0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
2aa00 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2aa30 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
2aa40 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa60 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2aa70 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
2aa80 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
2aa90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2aaa0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2aab0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2aac0 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
2aad0 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
2aae0 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
2aaf0 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
2ab00 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
2ab10 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
2ab20 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
2ab30 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
2ab40 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
2ab50 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
2ab60 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2ab70 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
2ab80 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2ab90 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
2aba0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
2abb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2abc0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
2abd0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2abe0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
2abf0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
2ac00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ac10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2ac20 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2ac30 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
2ac40 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
2ac50 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
2ac60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2ac70 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  TE ){.    /* If 
2ac80 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
2ac90 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
2aca0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
2acb0 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
2acc0 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
2acd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
2ace0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
2acf0 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
2ad00 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
2ad10 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
2ad20 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
2ad30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
2ad40 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
2ad50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ad60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2ad70 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
2ad80 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2ad90 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
2ada0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
2adb0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
2adc0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
2add0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
2ade0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2adf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
2ae00 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
2ae10 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2ae20 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
2ae30 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2ae40 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
2ae50 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2ae60 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
2ae70 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
2ae80 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
2ae90 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
2aea0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
2aeb0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
2aec0 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
2aed0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
2aee0 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
2aef0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
2af00 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
2af10 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
2af20 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
2af30 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
2af40 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
2af50 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
2af60 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2af70 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
2af80 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2af90 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
2afa0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2afb0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
2afc0 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
2afd0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
2afe0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
2aff0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
2b000 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
2b010 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
2b020 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
2b030 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
2b040 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
2b050 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
2b060 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
2b070 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
2b080 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2b090 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
2b0a0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
2b0b0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
2b0c0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
2b0d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b0e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2b0f0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
2b100 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2b110 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2b120 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b140 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2b150 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
2b160 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
2b170 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
2b180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b190 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
2b1a0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
2b1b0 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
2b1c0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2b1d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2b1e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b1f0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
2b200 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2b210 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
2b220 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
2b230 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
2b240 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
2b250 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
2b260 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
2b270 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
2b280 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
2b290 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
2b2a0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
2b2b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
2b2c0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
2b2d0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
2b2e0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
2b2f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
2b300 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2b310 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
2b320 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
2b330 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
2b340 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
2b350 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
2b360 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
2b370 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
2b380 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
2b390 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
2b3a0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
2b3b0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2b3c0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
2b3d0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
2b3e0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2b3f0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
2b400 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
2b410 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
2b420 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
2b430 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
2b440 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
2b450 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
2b460 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
2b470 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
2b480 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
2b490 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
2b4a0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
2b4b0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
2b4c0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
2b4d0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
2b4e0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
2b4f0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
2b500 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
2b510 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
2b520 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
2b530 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
2b540 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
2b550 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
2b560 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
2b570 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
2b580 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
2b590 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
2b5a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b5b0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2b5c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2b5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b5e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
2b5f0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2b600 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
2b610 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
2b620 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2b630 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
2b640 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
2b650 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
2b660 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2b670 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
2b680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b690 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2b6a0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
2b6b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b6c0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
2b6d0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
2b6e0 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
2b6f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
2b700 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
2b710 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
2b720 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
2b730 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
2b740 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
2b750 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2b760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2b770 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
2b780 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
2b790 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
2b7a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2b7b0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
2b7c0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
2b7d0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
2b7e0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
2b7f0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2b800 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
2b810 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
2b820 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
2b830 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
2b840 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
2b850 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
2b860 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
2b870 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
2b880 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2b890 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
2b8a0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
2b8b0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
2b8c0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2b8d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
2b8e0 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
2b8f0 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
2b900 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
2b910 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
2b920 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2b930 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
2b940 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b950 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2b960 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
2b970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b980 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2b990 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
2b9a0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
2b9b0 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
2b9c0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b9d0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
2b9e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2b9f0 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
2ba00 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
2ba10 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
2ba20 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
2ba30 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
2ba40 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
2ba50 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
2ba60 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
2ba70 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
2ba80 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
2ba90 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2baa0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2bab0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
2bac0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
2bad0 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
2bae0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2baf0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2bb00 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2bb10 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
2bb20 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
2bb30 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
2bb40 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
2bb50 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
2bb60 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2bb70 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2bb80 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
2bb90 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2bba0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2bbb0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
2bbc0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
2bbd0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2bbe0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
2bbf0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
2bc00 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
2bc10 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
2bc20 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
2bc30 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
2bc40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2bc50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2bc60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72  >mutex) );.  btr
2bc70 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2bc80 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2bc90 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
2bca0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
2bcb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bcc0 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
2bcd0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
2bce0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2bcf0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
2bd00 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e  }.  if( pCell+in
2bd10 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e  fo.iOverflow+3 >
2bd20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
2bd30 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b  age->maskPage ){
2bd40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2bd50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2bd60 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64    /* Cell extend
2bd70 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61  s past end of pa
2bd80 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ge */.  }.  ovfl
2bd90 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
2bda0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2bdb0 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
2bdc0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2bdd0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
2bde0 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
2bdf0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2be00 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
2be10 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
2be20 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
2be30 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
2be40 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
2be50 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
2be60 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
2be70 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
2be80 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
2be90 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
2bea0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
2beb0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
2bec0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
2bed0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
2bee0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
2bef0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
2bf00 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
2bf10 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
2bf20 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
2bf30 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
2bf40 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
2bf50 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
2bf60 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
2bf70 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
2bf80 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2bf90 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
2bfa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bfb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2bfc0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
2bfd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
2bfe0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
2bff0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
2c000 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
2c010 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2c020 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2c030 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
2c040 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
2c050 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2c060 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
2c070 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
2c080 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2c090 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
2c0a0 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
2c0b0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2c0c0 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
2c0d0 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
2c0e0 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
2c0f0 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
2c100 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
2c110 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
2c120 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
2c130 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
2c140 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
2c150 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
2c160 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
2c170 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
2c180 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
2c190 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
2c1a0 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
2c1b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2c1c0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
2c1d0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2c1e0 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
2c1f0 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
2c200 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
2c210 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
2c220 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
2c230 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
2c240 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
2c250 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
2c260 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
2c270 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
2c280 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
2c290 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
2c2a0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
2c2b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
2c2c0 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
2c2d0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2c2e0 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
2c2f0 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
2c300 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
2c310 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
2c320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2c330 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2c340 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2c350 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
2c360 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
2c370 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
2c380 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
2c390 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
2c3a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
2c3b0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
2c3c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
2c3d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2c3e0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
2c3f0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2c400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2c410 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
2c420 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
2c430 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
2c440 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
2c450 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
2c460 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
2c470 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
2c480 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
2c490 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
2c4a0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
2c4b0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
2c4c0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
2c4d0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
2c4e0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2c4f0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
2c500 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
2c510 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
2c520 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
2c530 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
2c540 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
2c550 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
2c560 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
2c570 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
2c580 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
2c590 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
2c5a0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
2c5b0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
2c5c0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
2c5d0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
2c5e0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
2c5f0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
2c600 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
2c610 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
2c620 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
2c630 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
2c640 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c650 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
2c660 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
2c670 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2c680 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
2c690 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
2c6a0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
2c6b0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
2c6c0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
2c6d0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
2c6e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
2c6f0 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
2c700 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
2c710 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
2c740 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
2c750 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
2c760 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
2c770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2c780 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
2c790 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
2c7a0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
2c7b0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
2c7c0 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
2c7d0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
2c7e0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
2c7f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2c800 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
2c810 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2c820 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
2c830 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
2c840 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
2c850 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2c860 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
2c870 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
2c880 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
2c890 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
2c8a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c8b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2c8c0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2c8d0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
2c8e0 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
2c8f0 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
2c900 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
2c910 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
2c920 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
2c930 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
2c940 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
2c950 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2c960 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
2c970 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
2c980 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2c990 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2c9a0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2c9b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2c9c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2c9d0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2c9e0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
2c9f0 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
2ca00 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2ca10 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2ca20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
2ca30 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
2ca40 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
2ca50 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2ca60 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
2ca70 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
2ca80 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
2ca90 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
2caa0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2cab0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
2cac0 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
2cad0 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ey);.  btreePars
2cae0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2caf0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2cb00 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
2cb10 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
2cb20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2cb30 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
2cb40 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
2cb50 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
2cb60 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
2cb70 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
2cb80 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
2cb90 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
2cba0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
2cbb0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2cbc0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2cbd0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
2cbe0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
2cbf0 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
2cc00 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37  ( NEVER(nKey>0x7
2cc10 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d  fffffff || pKey=
2cc20 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  =0) ){.      ret
2cc30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2cc40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2cc50 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
2cc60 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
2cc70 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
2cc80 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
2cc90 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
2cca0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
2ccb0 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
2ccc0 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
2ccd0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
2cce0 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
2ccf0 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
2cd00 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
2cd10 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
2cd20 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
2cd30 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
2cd40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2cd50 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
2cd60 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
2cd70 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
2cd80 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2cd90 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
2cda0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
2cdb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2cdc0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
2cdd0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
2cde0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
2cdf0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
2ce00 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
2ce10 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
2ce20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
2ce30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ce40 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
2ce50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2ce60 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2ce70 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2ce80 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
2ce90 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
2cea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ceb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2cec0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
2ced0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2cee0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
2cef0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
2cf00 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
2cf10 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
2cf20 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
2cf30 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
2cf40 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
2cf50 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
2cf60 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
2cf70 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2cf80 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
2cf90 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
2cfa0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
2cfb0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
2cfc0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
2cfd0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
2cfe0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
2cff0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
2d000 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
2d010 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2d020 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
2d030 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
2d040 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
2d050 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
2d060 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
2d070 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
2d080 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
2d090 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
2d0a0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
2d0b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
2d0c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2d0d0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2d0e0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
2d0f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
2d100 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
2d110 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
2d120 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
2d130 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
2d140 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2d150 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
2d160 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
2d170 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d180 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
2d190 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
2d1a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d1b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d1c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d1d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2d1e0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2d1f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d200 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2d210 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
2d220 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
2d230 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
2d240 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
2d250 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
2d260 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
2d270 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
2d280 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2d290 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
2d2a0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2d2b0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2d2c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2d2d0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2d2e0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
2d2f0 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
2d300 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2d310 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2d320 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2d330 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
2d340 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
2d350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d360 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
2d370 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
2d380 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2d390 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2d3a0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2d3b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d3c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2d3d0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
2d3e0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
2d3f0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
2d400 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2d410 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
2d420 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
2d430 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
2d440 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
2d450 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
2d460 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
2d470 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
2d480 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
2d490 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
2d4a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2d4b0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
2d4c0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
2d4d0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
2d4e0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
2d4f0 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
2d500 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2d510 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
2d520 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
2d530 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
2d540 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2d550 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2d560 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2d570 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2d580 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2d590 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2d5a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d5b0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2d5c0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
2d5d0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
2d5e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2d5f0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2d600 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2d610 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
2d620 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2d630 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2d640 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
2d650 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
2d660 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2d670 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2d680 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2d690 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d6a0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2d6b0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
2d6c0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
2d6d0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
2d6e0 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
2d6f0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
2d700 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
2d710 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
2d720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d730 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
2d740 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
2d750 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
2d760 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
2d770 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
2d780 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
2d790 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
2d7a0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
2d7b0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
2d7c0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2d7d0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
2d7e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2d7f0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2d800 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
2d810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d820 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
2d830 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
2d840 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
2d850 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
2d860 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
2d870 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
2d880 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
2d890 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
2d8a0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
2d8b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2d8c0 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
2d8d0 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
2d8e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
2d8f0 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
2d900 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2d910 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
2d920 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
2d930 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
2d940 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
2d950 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
2d960 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
2d970 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2d980 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
2d990 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33   int *pRC){.  u3
2d9a0 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  2 pc;         /*
2d9b0 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
2d9c0 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
2d9d0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
2d9e0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2d9f0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
2da00 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
2da10 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2da20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
2da30 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
2da40 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50  [] */.  u8 *endP
2da50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  tr;     /* End o
2da60 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
2da70 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
2da80 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2da90 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2daa0 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2dab0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
2dac0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
2dad0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
2dae0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2daf0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2db00 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
2db10 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2db20 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2db30 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
2db40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2db50 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2db60 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2db70 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2db80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2db90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2dba0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
2dbb0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2dbc0 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
2dbd0 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
2dbe0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
2dbf0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
2dc00 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2dc10 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
2dc20 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
2dc30 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
2dc40 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
2dc50 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2dc60 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
2dc70 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
2dc80 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2dc90 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
2dca0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2dcb0 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
2dcc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2dcd0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
2dce0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
2dcf0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
2dd00 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
2dd10 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
2dd20 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2dd30 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20 26 70 50  }.  endPtr = &pP
2dd40 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
2dd50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32  pPage->nCell - 2
2dd60 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ];.  assert( (SQ
2dd70 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
2dd80 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f  ptr)&1)==0 );  /
2dd90 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79 73 20  * ptr is always 
2dda0 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a  2-byte aligned *
2ddb0 2f 0a 20 20 77 68 69 6c 65 28 20 70 74 72 3c 65  /.  while( ptr<e
2ddc0 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 2a 28 75  ndPtr ){.    *(u
2ddd0 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a  16*)ptr = *(u16*
2dde0 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  )&ptr[2];.    pt
2ddf0 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50  r += 2;.  }.  pP
2de00 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
2de10 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2de20 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
2de30 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
2de40 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a  Free += 2;.}../*
2de50 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2de60 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
2de70 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
2de80 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
2de90 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
2dea0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
2deb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
2dec0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
2ded0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
2dee0 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
2def0 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
2df00 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
2df10 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2df20 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2df30 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
2df40 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
2df50 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
2df60 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
2df70 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
2df80 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66   in pPage->apOvf
2df90 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
2dfa0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
2dfb0 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
2dfc0 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
2dfd0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
2dfe0 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
2dff0 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
2e000 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
2e010 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
2e020 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
2e030 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
2e040 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
2e050 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
2e060 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
2e070 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2e080 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
2e090 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
2e0a0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
2e0b0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2e0c0 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
2e0d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
2e0e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
2e0f0 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
2e100 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
2e110 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
2e120 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
2e130 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
2e140 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
2e150 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
2e160 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
2e170 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
2e180 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e190 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
2e1a0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
2e1b0 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
2e1c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2e1d0 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
2e1e0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
2e1f0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
2e200 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
2e210 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2e220 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
2e230 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
2e240 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
2e250 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
2e260 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
2e270 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
2e280 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
2e290 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
2e2a0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
2e2b0 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
2e2c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
2e2d0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
2e2e0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
2e2f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
2e300 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
2e310 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
2e320 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
2e330 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
2e340 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
2e350 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
2e360 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
2e370 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
2e380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e390 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2e3a0 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
2e3b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
2e3c0 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
2e3d0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2e3e0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2e3f0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
2e400 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
2e410 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
2e420 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
2e430 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
2e440 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
2e450 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
2e460 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
2e470 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
2e480 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
2e490 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
2e4a0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
2e4b0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
2e4c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
2e4d0 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
2e4e0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
2e4f0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2e500 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a 20 45  dPtr;       /* E
2e510 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  nd of the loop *
2e520 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d  /..  int nSkip =
2e530 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30   (iChild ? 4 : 0
2e540 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  );..  if( *pRC )
2e550 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2e560 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
2e570 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
2e580 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
2e590 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e5a0 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
2e5b0 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2e5c0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2e5d0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
2e5e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2e5f0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
2e600 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2e610 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
2e620 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2e630 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
2e640 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
2e650 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2e660 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e670 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2e680 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2e690 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2e6a0 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2e6b0 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2e6c0 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2e6d0 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2e6e0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2e6f0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2e700 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2e710 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2e720 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2e730 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2e740 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2e750 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2e760 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2e770 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2e780 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2e790 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2e7a0 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2e7b0 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2e7c0 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2e7d0 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2e7e0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2e7f0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2e800 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e810 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2e820 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2e830 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2e840 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2e850 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2e860 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2e870 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2e880 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2e890 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2e8a0 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2e8b0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2e8c0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2e8d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2e8e0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2e8f0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2e900 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2e910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2e920 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2e930 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
2e940 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2e950 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
2e960 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
2e970 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2e980 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
2e990 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2e9a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2e9b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2e9c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2e9d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e9e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2e9f0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2ea00 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2ea10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ea20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ea30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2ea40 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2ea50 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2ea60 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2ea70 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2ea80 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2ea90 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2eaa0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2eab0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2eac0 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2ead0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2eae0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2eaf0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2eb00 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2eb10 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2eb20 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
2eb30 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
2eb40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2eb50 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
2eb60 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
2eb70 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
2eb80 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
2eb90 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
2eba0 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
2ebb0 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
2ebc0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
2ebd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
2ebe0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
2ebf0 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
2ec00 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
2ec10 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
2ec20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2ec30 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  nSkip);.    if( 
2ec40 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
2ec50 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69  put4byte(&data[i
2ec60 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  dx], iChild);.  
2ec70 20 20 7d 0a 20 20 20 20 70 74 72 20 3d 20 26 64    }.    ptr = &d
2ec80 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20 20 65 6e  ata[end];.    en
2ec90 64 50 74 72 20 3d 20 26 64 61 74 61 5b 69 6e 73  dPtr = &data[ins
2eca0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ];.    assert( (
2ecb0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
2ecc0 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20  T(ptr)&1)==0 ); 
2ecd0 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79   /* ptr is alway
2ece0 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 2-byte aligned
2ecf0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
2ed00 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a 20 20 20  tr>endPtr ){.   
2ed10 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20     *(u16*)ptr = 
2ed20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d 32 5d 3b  *(u16*)&ptr[-2];
2ed30 0a 20 20 20 20 20 20 70 74 72 20 2d 3d 20 32 3b  .      ptr -= 2;
2ed40 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
2ed50 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
2ed60 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
2ed70 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
2ed80 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
2ed90 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
2eda0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2edb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2edc0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
2edd0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2ede0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
2edf0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
2ee00 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
2ee10 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
2ee20 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
2ee30 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2ee40 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2ee50 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
2ee60 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
2ee70 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
2ee80 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
2ee90 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
2eea0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
2eeb0 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
2eec0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
2eed0 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
2eee0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
2eef0 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
2ef00 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
2ef10 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
2ef20 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
2ef30 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
2ef40 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
2ef50 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
2ef60 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
2ef70 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
2ef80 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
2ef90 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
2efa0 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
2efb0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
2efc0 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
2efd0 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
2efe0 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
2eff0 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
2f000 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
2f010 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
2f020 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2f030 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2f040 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
2f050 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ptr;     /* Addr
2f060 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
2f070 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
2f080 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
2f090 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2f0a0 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
2f0b0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
2f0c0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2f0d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f0e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
2f0f0 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20   for pPage */.  
2f100 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
2f110 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f120 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2f130 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
2f140 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  on pPage */.  co
2f150 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20  nst int nUsable 
2f160 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
2f170 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61  ableSize; /* Usa
2f180 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65  ble size of page
2f190 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2f1a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2f1b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2f1c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f1d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2f1e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2f1f0 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
2f200 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45  Cell<=(int)MX_CE
2f210 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0a 20  LL(pPage->pBt). 
2f220 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
2f230 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
2f240 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a  ->pBt)<=10921);.
2f250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f260 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f270 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f280 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
2f290 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68   that the page h
2f2a0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72  as just been zer
2f2b0 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28  oed by zeroPage(
2f2c0 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ) */.  assert( p
2f2d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2f2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32  ;.  assert( get2
2f2f0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
2f300 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
2f310 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
2f320 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
2f330 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
2f340 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
2f350 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
2f360 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
2f370 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61  {.    u16 sz = a
2f380 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65  Size[i];.    pCe
2f390 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2f3a0 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a  cellbody -= sz;.
2f3b0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
2f3c0 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
2f3d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2f3e0 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
2f3f0 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
2f400 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
2f410 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
2f420 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
2f430 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
2f440 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2f450 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
2f460 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
2f470 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2f480 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
2f490 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
2f4a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
2f4b0 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
2f4c0 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
2f4d0 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
2f4e0 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
2f4f0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2f500 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
2f510 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2f520 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2f530 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
2f540 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2f550 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2f560 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2f570 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
2f580 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2f590 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
2f5a0 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
2f5b0 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
2f5c0 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
2f5d0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2f5e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
2f5f0 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
2f600 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
2f610 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
2f620 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
2f630 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
2f640 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
2f650 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
2f660 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
2f670 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
2f680 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
2f690 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
2f6a0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2f6b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
2f6c0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
2f6d0 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
2f6e0 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
2f6f0 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
2f700 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
2f710 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f720 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2f730 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2f740 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
2f750 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
2f760 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
2f770 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
2f780 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
2f790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f7a0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
2f7b0 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
2f7c0 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
2f7d0 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
2f7e0 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
2f7f0 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
2f800 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
2f810 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
2f820 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
2f830 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
2f840 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
2f850 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
2f860 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
2f870 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
2f880 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
2f890 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
2f8a0 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
2f8b0 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
2f8c0 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
2f8d0 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
2f8e0 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
2f8f0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
2f900 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
2f910 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
2f920 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
2f930 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
2f940 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
2f950 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
2f960 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
2f970 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
2f980 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
2f990 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
2f9a0 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
2f9b0 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
2f9c0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
2f9d0 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
2f9e0 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
2f9f0 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
2fa00 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
2fa10 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
2fa20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
2fa30 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
2fa40 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
2fa50 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
2fa60 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
2fa70 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
2fa80 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
2fa90 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
2faa0 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
2fab0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2fac0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
2fad0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
2fae0 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
2faf0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
2fb00 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
2fb10 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
2fb20 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
2fb30 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
2fb40 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
2fb50 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
2fb60 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
2fb70 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2fb80 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
2fb90 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
2fba0 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
2fbb0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
2fbc0 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
2fbd0 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
2fbe0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2fbf0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
2fc00 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
2fc10 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
2fc20 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
2fc30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
2fc40 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
2fc50 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
2fc60 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
2fc70 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
2fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc90 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
2fca0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2fcb0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcd0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2fce0 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
2fcf0 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
2fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd10 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2fd20 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
2fd30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2fd40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2fd50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2fd60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2fd70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2fd80 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2fd90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2fda0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2fdb0 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  =1 );..  /* This
2fdc0 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
2fdd0 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
2fde0 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
2fdf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2fe00 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  /.  if( pPage->n
2fe10 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2fe20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fe30 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
2fe40 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
2fe50 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
2fe60 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
2fe70 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
2fe80 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
2fe90 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
2fea0 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
2feb0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
2fec0 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
2fed0 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
2fee0 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
2fef0 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
2ff00 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
2ff10 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
2ff20 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2ff30 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
2ff40 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
2ff50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ff60 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
2ff70 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
2ff80 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
2ff90 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20  e->apOvfl[0];.  
2ffa0 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
2ffb0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2ffc0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
2ffd0 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
2ffe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2fff0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
30000 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
30010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30020 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
30030 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
30040 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
30050 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
30060 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
30070 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
30080 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
30090 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
300a0 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
300b0 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
300c0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
300d0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
300e0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
300f0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
30100 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
30110 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
30120 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
30130 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
30140 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
30150 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
30160 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
30170 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
30180 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
30190 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
301a0 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
301b0 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
301c0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
301d0 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
301e0 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
301f0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
30200 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
30210 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
30220 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
30230 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
30240 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
30250 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
30260 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
30270 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
30280 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
30290 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
302a0 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
302b0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
302c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
302d0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
302e0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
302f0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
30300 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
30310 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
30320 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
30330 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
30340 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
30350 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
30360 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
30370 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
30380 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
30390 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
303a0 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
303b0 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
303c0 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
303d0 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
303e0 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
303f0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
30400 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
30410 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
30420 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
30430 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
30440 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
30450 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
30460 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
30470 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
30480 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
30490 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
304a0 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
304b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
304c0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
304d0 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
304e0 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
304f0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
30500 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
30510 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
30520 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
30530 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
30540 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
30550 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
30560 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
30570 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
30580 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
30590 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
305a0 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
305b0 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
305c0 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
305d0 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
305e0 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
305f0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
30600 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
30610 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
30620 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
30630 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
30640 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
30650 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
30660 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
30670 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
30680 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
30690 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
306a0 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
306b0 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
306c0 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
306d0 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
306e0 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
306f0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
30700 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
30710 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
30720 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
30730 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
30740 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
30750 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
30760 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
30770 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
30780 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
30790 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
307a0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
307b0 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
307c0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
307d0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
307e0 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
307f0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
30800 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
30810 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
30820 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
30830 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
30840 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
30850 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
30860 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
30870 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
30880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30890 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
308a0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
308b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
308c0 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
308d0 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
308e0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
308f0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
30900 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
30910 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
30920 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
30930 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
30940 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
30950 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
30960 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
30970 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
30980 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
30990 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
309a0 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
309b0 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
309c0 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
309d0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
309e0 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
309f0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
30a00 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
30a10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
30a20 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
30a30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30a40 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
30a50 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
30a60 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
30a70 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
30a80 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
30a90 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
30aa0 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
30ab0 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
30ac0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
30ad0 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
30ae0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
30af0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
30b00 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
30b10 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
30b20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
30b30 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
30b40 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
30b50 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
30b60 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
30b70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30b80 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
30b90 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
30ba0 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
30bb0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
30bc0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30bd0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
30be0 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
30bf0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
30c00 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
30c10 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
30c20 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
30c30 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
30c40 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
30c50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
30c60 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
30c70 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
30c80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
30c90 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
30ca0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
30cb0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
30cc0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
30cd0 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
30ce0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
30cf0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
30d00 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
30d10 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
30d20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
30d30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
30d40 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
30d50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30d60 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
30d70 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
30d80 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
30d90 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
30da0 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
30db0 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
30dc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
30dd0 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
30de0 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
30df0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
30e00 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
30e10 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
30e20 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
30e30 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
30e40 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
30e50 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
30e60 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
30e70 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
30e80 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
30e90 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
30ea0 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
30eb0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
30ec0 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
30ed0 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
30ee0 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
30ef0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
30f00 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
30f10 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
30f20 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66  ** MemPage.apOvf
30f30 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
30f40 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
30f50 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
30f60 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
30f70 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
30f80 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
30f90 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
30fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
30fb0 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
30fc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
30fd0 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
30fe0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
30ff0 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
31000 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
31010 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
31020 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
31030 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
31040 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
31050 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
31060 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
31070 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f  atic void copyNo
31080 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67  deContent(MemPag
31090 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67  e *pFrom, MemPag
310a0 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43  e *pTo, int *pRC
310b0 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
310c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
310d0 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
310e0 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
310f0 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  pBt;.    u8 * co
31100 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
31110 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38  m->aData;.    u8
31120 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70   * const aTo = p
31130 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  To->aData;.    i
31140 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
31150 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
31160 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f  fset;.    int co
31170 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
31180 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
31190 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  00 : 0);.    int
311a0 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61   rc;.    int iDa
311b0 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73  ta;.  .  .    as
311c0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
311d0 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nit );.    asser
311e0 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e  t( pFrom->nFree>
311f0 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61  =iToHdr );.    a
31200 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
31210 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
31220 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  5]) <= (int)pBt-
31230 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
31240 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
31250 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
31260 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
31270 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
31280 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
31290 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
312a0 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
312b0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
312c0 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
312d0 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
312e0 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
312f0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
31300 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
31310 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
31320 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
31330 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
31340 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
31350 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
31360 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
31370 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
31380 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
31390 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
313a0 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
313b0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
313c0 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
313d0 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
313e0 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
313f0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
31400 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
31410 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
31420 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
31430 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
31440 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
31450 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
31460 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
31470 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
31480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31490 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
314a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
314b0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
314c0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
314d0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
314e0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
314f0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
31500 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
31510 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
31520 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
31530 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
31540 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
31550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
31560 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
31570 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
31580 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
31590 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
315a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
315b0 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
315c0 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
315d0 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
315e0 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
315f0 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
31600 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
31610 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
31620 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
31630 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
31640 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
31650 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
31660 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
31670 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
31680 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
31690 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
316a0 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
316b0 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
316c0 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
316d0 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
316e0 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
316f0 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
31700 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
31710 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
31720 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
31730 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
31740 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
31750 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
31760 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
31770 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
31780 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
31790 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
317a0 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
317b0 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
317c0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
317d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
317e0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
317f0 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
31800 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
31810 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
31820 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
31830 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
31840 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
31850 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
31860 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
31870 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
31880 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
31890 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
318a0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
318b0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
318c0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
318d0 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
318e0 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
318f0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
31900 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
31910 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
31920 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
31930 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
31940 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
31950 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
31960 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
31970 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
31980 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
31990 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
319a0 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
319b0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
319c0 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
319d0 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
319e0 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
319f0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
31a00 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
31a10 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
31a20 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
31a30 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
31a40 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
31a50 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
31a60 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
31a70 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
31a80 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
31a90 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
31aa0 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
31ab0 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
31ac0 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
31ad0 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
31ae0 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
31af0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
31b00 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
31b10 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
31b20 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
31b30 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
31b40 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
31b50 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
31b60 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
31b70 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
31b80 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
31b90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
31ba0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
31bb0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
31bc0 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
31bd0 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
31be0 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
31bf0 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
31c00 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
31c10 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
31c20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
31c30 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
31c40 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
31c50 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
31c60 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
31c70 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
31c80 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
31c90 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
31ca0 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
31cb0 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
31cc0 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
31cd0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
31ce0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
31cf0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
31d00 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
31d10 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
31d20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
31d30 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
31d40 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
31d50 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
31d60 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
31d70 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
31d80 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
31d90 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
31da0 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
31db0 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
31dc0 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
31dd0 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
31de0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
31df0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
31e00 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69  ITE_NOMEM..*/.#i
31e10 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
31e20 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20  ER) && _MSC_VER 
31e30 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e  >= 1700 && defin
31e40 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67  ed(_M_ARM).#prag
31e50 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20  ma optimize("", 
31e60 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  off).#endif.stat
31e70 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
31e80 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
31e90 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
31ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
31eb0 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
31ec0 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
31ed0 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
31ee0 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
31ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
31f00 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
31f10 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
31f20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
31f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f40 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
31f50 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
31f60 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
31f70 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20   int isRoot,    
31f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f90 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
31fa0 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
31fb0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c  ge */.  int bBul
31fc0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
31fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31fe0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
31ff0 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c  part of a bulk l
32000 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  oad */.){.  BtSh
32010 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
32020 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32030 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
32040 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
32050 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
32070 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
32080 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
32090 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
320a0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
320b0 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
320c0 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
320d0 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
32100 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
32110 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
32140 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
32150 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32170 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
32180 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
32190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321a0 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
321b0 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
321c0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
321d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
321e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
321f0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
32200 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
32210 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
32220 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
32230 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
32240 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
32250 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
32260 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
32270 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
32280 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
32290 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
322a0 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
322b0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
322c0 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
322d0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
322e0 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32300 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
32310 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
32320 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
32330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
32340 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
32350 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
32360 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
32370 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
32380 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
32390 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
323a0 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
323b0 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
323c0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
323d0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
323e0 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
323f0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
32400 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
32410 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
32420 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
32430 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
32440 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
32450 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
32460 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
32470 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
32480 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
32490 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
324a0 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
324b0 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
324c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
324d0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
324e0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
324f0 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
32500 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
32510 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
32540 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
32550 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
32560 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
32570 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
32580 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
32590 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
325a0 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
325b0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
325c0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
325d0 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
325e0 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
325f0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
32600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
32610 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
32620 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
32630 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
32640 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
32650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32660 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
32670 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
32680 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
32690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
326a0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
326b0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
326c0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
326d0 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
326e0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
326f0 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
32700 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
32710 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
32720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32730 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
32740 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
32750 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
32760 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
32770 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
32780 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
32790 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
327a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
327b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
327c0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
327d0 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
327e0 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
327f0 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
32800 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
32810 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
32820 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
32830 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
32840 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
32850 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
32860 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
32870 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
32880 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
32890 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
328a0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
328b0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
328c0 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
328d0 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
328e0 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
328f0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
32900 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
32910 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
32920 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
32930 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
32940 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
32950 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
32960 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
32970 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
32980 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
32990 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
329a0 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  0]==iParentIdx )
329b0 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
329c0 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
329d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
329e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
329f0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
32a00 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
32a10 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
32a20 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
32a30 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
32a40 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
32a50 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
32a60 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
32a70 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
32a80 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
32a90 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
32aa0 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
32ab0 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
32ac0 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
32ad0 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
32ae0 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
32af0 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
32b00 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
32b10 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
32b20 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
32b30 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
32b40 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
32b50 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
32b60 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
32b70 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
32b80 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
32b90 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
32ba0 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
32bb0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
32bc0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
32bd0 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
32be0 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
32bf0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
32c00 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
32c10 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
32c20 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
32c30 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
32c40 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
32c50 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
32c60 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
32c70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
32c80 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
32c90 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  nxDiv = 0;.  }el
32ca0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
32cb0 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c  bBulk==0 || bBul
32cc0 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  k==1 );.    if( 
32cd0 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cf0 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
32d00 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
32d10 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
32d20 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
32d30 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d  i-2+bBulk;.    }
32d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
32d50 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a  rt( bBulk==0 );.
32d60 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
32d70 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
32d80 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c  }.    i = 2-bBul
32d90 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20  k;.  }.  nOld = 
32da0 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78  i+1;.  if( (i+nx
32db0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
32dc0 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
32dd0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
32de0 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
32df0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
32e00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
32e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
32e20 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
32e30 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
32e40 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
32e50 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
32e60 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
32e70 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
32e80 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
32e90 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
32ea0 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
32eb0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32ec0 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
32ed0 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
32ee0 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
32ef0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
32f00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
32f10 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
32f20 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
32f30 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
32f40 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
32f50 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
32f60 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
32f70 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f  iv==pParent->aiO
32f80 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65 6e  vfl[0] && pParen
32f90 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  t->nOverflow ){.
32fa0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
32fb0 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c   pParent->apOvfl
32fc0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  [0];.      pgno 
32fd0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
32fe0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
32ff0 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
33000 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
33010 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
33020 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
33030 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
33040 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
33050 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
33060 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
33070 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
33080 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
33090 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
330a0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
330b0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
330c0 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
330d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
330e0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
330f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
33100 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
33110 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
33120 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
33130 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
33140 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
33150 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
33160 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
33170 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
33180 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
33190 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
331a0 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
331b0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
331c0 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
331d0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
331e0 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
331f0 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
33200 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
33210 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
33220 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
33230 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
33240 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
33250 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
33260 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73  t if we are in s
33270 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
33280 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c  e. In secure-del
33290 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20  ete mode,.      
332a0 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
332b0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
332c0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
332d0 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
332e0 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
332f0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
33300 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
33310 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
33320 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
33330 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
33340 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
33350 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
33360 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
33370 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
33380 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
33390 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
333a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
333b0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
333c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
333d0 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f  Off;..        iO
333e0 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
333f0 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
33400 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
33410 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
33420 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
33430 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
33440 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  )>(int)pBt->usab
33450 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
33460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33470 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33480 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
33490 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
334a0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
334b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
334c0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
334d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
334e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
334f0 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  y(&aOvflSpace[iO
33500 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  ff], apDiv[i], s
33510 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zNew[i]);.      
33520 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
33530 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
33540 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
33550 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta];.        }. 
33560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
33570 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
33580 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
33590 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
335a0 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
335b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
335c0 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
335d0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
335e0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
335f0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
33600 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
33610 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
33620 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
33630 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
33640 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
33650 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
33660 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
33670 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
33680 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
33690 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
336a0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
336b0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
336c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
336d0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
336e0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
336f0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
33700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33710 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
33720 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
33730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33750 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
33760 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
33770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33790 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
337a0 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
337b0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
337c0 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
337d0 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
337e0 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
337f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
33800 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
33810 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
33820 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
33830 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
33840 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
33850 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
33860 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
33870 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
33880 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
33890 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
338a0 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
338b0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
338c0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
338d0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
338e0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
338f0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
33900 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
33910 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
33920 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
33930 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
33940 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
33950 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
33960 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
33970 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
33980 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
33990 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
339a0 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
339b0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
339c0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
339d0 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
339e0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
339f0 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
33a00 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
33a10 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
33a20 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
33a30 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
33a40 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
33a50 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
33a60 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
33a70 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
33a80 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
33a90 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
33aa0 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
33ab0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
33ac0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
33ad0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
33ae0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
33af0 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
33b00 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
33b10 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
33b20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
33b30 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
33b40 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
33b50 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
33b60 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
33b70 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
33b80 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
33b90 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
33ba0 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
33bb0 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
33bc0 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
33bd0 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
33be0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
33bf0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
33c00 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
33c10 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
33c20 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
33c30 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
33c40 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
33c50 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
33c60 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
33c70 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
33c80 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
33c90 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
33ca0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
33cb0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
33cc0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
33cd0 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
33ce0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
33cf0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
33d00 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
33d10 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
33d20 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
33d30 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
33d40 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
33d50 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
33d60 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
33d70 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
33d80 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
33d90 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
33da0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
33db0 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
33dc0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
33dd0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
33de0 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
33df0 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
33e00 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d  w;.    if( pOld-
33e10 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
33e20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
33e30 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
33e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
33e50 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
33e60 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
33e70 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
33e80 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
33e90 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
33ea0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
33eb0 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
33ec0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
33ed0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
33ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
33ef0 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74  {.      u8 *aDat
33f00 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b  a = pOld->aData;
33f10 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50  .      u16 maskP
33f20 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b  age = pOld->mask
33f30 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20  Page;.      u16 
33f40 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c  cellOffset = pOl
33f50 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  d->cellOffset;. 
33f60 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
33f70 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
33f80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
33f90 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
33fa0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
33fb0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  Cell] = findCell
33fc0 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61  v2(aData, maskPa
33fd0 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20  ge, cellOffset, 
33fe0 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
33ff0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
34000 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
34010 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
34020 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
34030 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20       }.    }    
34040 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f     .    if( i<nO
34050 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
34060 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
34070 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
34080 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
34090 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
340a0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
340b0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
340c0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
340d0 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
340e0 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
340f0 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
34100 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
34110 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
34120 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
34130 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20  assert( iSpace1 
34140 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
34150 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
34160 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
34170 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
34180 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
34190 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
341a0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
341b0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
341c0 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
341d0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
341e0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
341f0 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
34200 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
34210 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
34220 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
34230 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
34240 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
34250 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
34260 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
34270 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
34280 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
34290 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
342a0 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
342b0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
342c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
342d0 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
342e0 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
342f0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
34300 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
34310 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
34320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34330 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
34340 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
34350 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
34360 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
34370 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
34380 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
34390 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
343a0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
343b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
343c0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
343d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
343e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
343f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
34400 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
34410 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
34420 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
34430 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
34440 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
34450 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
34460 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
34470 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
34480 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
34490 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
344a0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
344b0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
344c0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
344d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
344e0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
344f0 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
34500 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
34510 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
34520 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
34530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
34540 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
34550 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
34560 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
34570 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
34580 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
34590 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
345a0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
345b0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
345c0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
345d0 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
345e0 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
345f0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
34600 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
34610 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
34620 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
34630 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
34640 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
34650 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
34660 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
34670 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
34680 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
34690 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
346a0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
346b0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
346c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
346d0 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
346e0 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
346f0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
34700 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
34710 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
34720 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
34730 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
34740 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
34750 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
34760 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
34770 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
34780 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
34790 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
347a0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
347b0 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
347c0 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
347d0 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
347e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
347f0 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
34800 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
34810 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
34820 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
34830 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
34840 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
34850 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
34860 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
34870 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
34880 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
34890 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
348a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
348b0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
348c0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
348d0 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
348e0 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
348f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
34900 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
34910 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
34920 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
34930 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
34940 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
34950 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
34960 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
34970 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
34980 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
34990 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
349a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
349b0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
349c0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
349d0 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
349e0 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
349f0 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
34a00 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
34a10 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
34a20 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
34a30 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
34a40 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
34a50 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
34a60 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
34a70 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
34a80 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
34a90 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
34aa0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
34ab0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
34ac0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
34ad0 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
34ae0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
34af0 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
34b00 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
34b10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
34b20 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
34b30 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
34b40 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
34b50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
34b60 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
34b70 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
34b80 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
34b90 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
34ba0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
34bb0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
34bc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
34bd0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34be0 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
34bf0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
34c00 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20  e( szRight==0 . 
34c10 20 20 20 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b        || (!bBulk
34c20 20 26 26 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   && szRight+szCe
34c30 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
34c40 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a  (szCell[r]+2)) .
34c50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 7a 52      ){.      szR
34c60 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
34c70 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
34c80 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
34c90 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
34ca0 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
34cb0 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
34cc0 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
34cd0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
34ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
34cf0 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
34d00 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
34d10 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20   szLeft;.  }..  
34d20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75  /* Either we fou
34d30 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  nd one or more c
34d40 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29  ells (cntnew[0])
34d50 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a  >0) or pPage is.
34d60 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
34d70 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
34d80 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
34d90 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
34da0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
34db0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
34dc0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
34dd0 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
34de0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54  .  **.  ** UPDAT
34df0 45 3a 20 20 54 68 65 20 61 73 73 65 72 74 28 29  E:  The assert()
34e00 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65   below is not ne
34e10 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 69  cessarily true i
34e20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
34e30 20 2a 2a 20 66 69 6c 65 20 69 73 20 63 6f 72 72   ** file is corr
34e40 75 70 74 2e 20 20 54 68 65 20 63 6f 72 72 75 70  upt.  The corrup
34e50 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 65 74  tion will be det
34e60 65 63 74 65 64 20 61 6e 64 20 72 65 70 6f 72 74  ected and report
34e70 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e  ed later.  ** in
34e80 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
34e90 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
34ea0 65 65 64 20 74 6f 20 61 63 74 20 75 70 6f 6e 20  eed to act upon 
34eb0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66  it now..  */.#if
34ec0 20 30 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   0.  assert( cnt
34ed0 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
34ee0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
34ef0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
34f00 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  =0) );.#endif.. 
34f10 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
34f20 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
34f30 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
34f40 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
34f50 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
34f60 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
34f70 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
34f80 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
34f90 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
34fa0 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
34fb0 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
34fc0 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
34fd0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
34fe0 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
34ff0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
35000 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35010 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
35020 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
35030 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
35040 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
35050 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
35060 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
35070 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
35080 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
35090 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
350a0 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
350b0 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
350c0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
350d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
350e0 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
350f0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
35100 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35110 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35120 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
35130 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
35140 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
35150 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
35160 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
35170 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20  o, (bBulk ? 1 : 
35180 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20  pgno), 0);.     
35190 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
351a0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
351b0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
351c0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
351d0 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
351e0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
351f0 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
35200 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
35210 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
35220 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
35230 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
35240 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
35250 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
35260 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
35270 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
35280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
352a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
352b0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
352c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
352d0 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
352e0 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
352f0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
35300 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
35310 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
35320 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  ){.    freePage(
35330 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a  apOld[i], &rc);.
35340 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35350 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35360 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
35370 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
35380 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
35390 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
353a0 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
353b0 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
353c0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
353d0 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
353e0 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
353f0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
35400 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
35410 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
35420 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
35430 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
35440 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
35450 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
35460 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
35470 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
35480 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
35490 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
354a0 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
354b0 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
354c0 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
354d0 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
354e0 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
354f0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
35500 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
35510 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
35520 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
35530 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
35540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
35550 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
35560 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
35570 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
35580 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
35590 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
355a0 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
355b0 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
355c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
355d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
355e0 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
355f0 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
35600 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
35610 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
35620 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
35630 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
35640 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
35650 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
35660 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
35670 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
35680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35690 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
356a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
356b0 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
356c0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
356d0 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
356e0 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
356f0 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
35700 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
35710 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
35720 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
35730 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
35740 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
35750 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
35760 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
35770 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
35780 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
35790 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
357a0 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
357b0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
357c0 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
357d0 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
357e0 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
357f0 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
35800 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
35810 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
35820 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
35830 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
35840 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
35850 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35860 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
35870 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
35880 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
35890 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
358a0 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
358b0 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
358c0 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
358d0 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
358e0 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
358f0 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
35900 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
35910 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
35920 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
35930 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
35940 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
35950 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
35960 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
35970 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
35980 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
35990 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
359a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
359b0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
359c0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
359d0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
359e0 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
359f0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
35a00 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
35a10 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
35a20 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
35a30 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
35a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
35a50 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
35a60 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
35a70 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
35a80 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
35a90 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
35aa0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
35ab0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
35ac0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
35ad0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
35ae0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
35af0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
35b00 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
35b10 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
35b20 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
35b30 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
35b40 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
35b50 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
35b60 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
35b70 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
35b80 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
35b90 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
35ba0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
35bb0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
35bc0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
35bd0 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
35be0 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
35bf0 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
35c00 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
35c10 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
35c20 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
35c30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
35c40 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
35c50 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
35c60 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
35c70 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
35c80 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
35c90 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
35ca0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
35cb0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
35cc0 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
35cd0 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
35ce0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
35cf0 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
35d00 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
35d10 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
35d20 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
35d30 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
35d40 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
35d50 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
35d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
35d70 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
35d80 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
35d90 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
35da0 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
35db0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
35dc0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
35dd0 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
35de0 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
35df0 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
35e00 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
35e10 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
35e20 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
35e30 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
35e40 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
35e50 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
35e60 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
35e70 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
35e80 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
35e90 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
35ea0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
35eb0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
35ec0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
35ed0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
35ee0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
35ef0 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
35f00 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
35f10 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
35f20 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
35f30 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
35f40 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
35f50 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
35f60 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
35f70 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
35f80 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
35f90 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
35fa0 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
35fb0 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
35fc0 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
35fd0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
35fe0 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
35ff0 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
36000 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
36010 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
36020 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
36030 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
36040 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
36050 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
36060 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
36070 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
36080 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
36090 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
360a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
360b0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
360c0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
360d0 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
360e0 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
360f0 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
36100 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
36110 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
36120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36130 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
36140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
36150 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
36160 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
36170 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20  ert( iOvflSpace 
36180 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
36190 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
361a0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
361b0 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
361c0 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
361d0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
361e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
361f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
36200 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
36210 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
36220 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36230 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
36240 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
36250 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
36260 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
36270 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
36280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
36290 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
362a0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
362b0 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
362c0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
362d0 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
362e0 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
362f0 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
36300 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
36310 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
36320 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a  zChild, 4);.  }.
36330 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26  .  if( isRoot &&
36340 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
36350 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68  =0 && pParent->h
36360 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b  drOffset<=apNew[
36370 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  0]->nFree ){.   
36380 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
36390 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
363a0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
363b0 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20  cells. The only 
363c0 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70  sibling.    ** p
363d0 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74  age is the right
363e0 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
363f0 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63  rent. Copy the c
36400 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
36410 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65     ** child page
36420 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
36430 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65  , decreasing the
36440 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20   overall height 
36450 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d  of the.    ** b-
36460 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62  tree structure b
36470 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64  y one. This is d
36480 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20  escribed as the 
36490 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77  "balance-shallow
364a0 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61  er".    ** sub-a
364b0 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65  lgorithm in some
364c0 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
364d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
364e0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
364f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
36500 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  , the call to co
36510 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20  pyNodeContent() 
36520 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c  .    ** sets all
36530 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
36540 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
36550 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69  ng to database i
36560 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  mage pages .    
36570 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
36580 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
36590 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  ed within the co
365a0 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69  ntent being copi
365b0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
365c0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73  * The second ass
365d0 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69  ert below verifi
365e0 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c  es that the chil
365f0 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  d page is defrag
36600 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69  mented.    ** (i
36610 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74  t must be, as it
36620 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73   was just recons
36630 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73  tructed using as
36640 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54  semblePage()). T
36650 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d  his.    ** is im
36660 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70  portant if the p
36670 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65  arent page happe
36680 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20  ns to be page 1 
36690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
366a0 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a      ** image.  *
366b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e  /.    assert( nN
366c0 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ew==1 );.    ass
366d0 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e  ert( apNew[0]->n
366e0 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20  Free == .       
366f0 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65   (get2byte(&apNe
36700 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d  w[0]->aData[5])-
36710 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66  apNew[0]->cellOf
36720 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  fset-apNew[0]->n
36730 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a  Cell*2) .    );.
36740 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
36750 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
36760 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20  arent, &rc);.   
36770 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b   freePage(apNew[
36780 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73  0], &rc);.  }els
36790 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55  e if( ISAUTOVACU
367a0 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78  UM ){.    /* Fix
367b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
367c0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
367d0 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20   the cells that 
367e0 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f  were shifted aro
367f0 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65  und. .    ** The
36800 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
36810 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
36820 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
36830 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
36840 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  to.    ** be dea
36850 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
36860 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
36870 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
36880 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
36890 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61  t.    ** many ha
368a0 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c  ve not. The foll
368b0 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61  owing is a summa
368c0 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry:.    **.    *
368d0 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69  *   1) The entri
368e0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
368f0 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  th new sibling p
36900 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
36910 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73  ot.    **      s
36920 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69  iblings when thi
36930 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
36940 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76  alled. These hav
36950 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  e already.    **
36960 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20        been set. 
36970 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  We don't need to
36980 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64   worry about old
36990 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
369a0 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ere.    **      
369b0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
369c0 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65  e-list - the fre
369d0 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73  ePage() code has
369e0 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20   taken care.    
369f0 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
36a00 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36a10 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72    2) The pointer
36a20 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73  -map entries ass
36a30 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
36a40 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a   first overflow.
36a50 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65      **      page
36a60 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77   in any overflow
36a70 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20   chains used by 
36a80 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
36a90 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a  s. These .    **
36aa0 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20        have also 
36ab0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b  already been tak
36ac0 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68  en care of by th
36ad0 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63  e insertCell() c
36ae0 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
36af0 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73  **   3) If the s
36b00 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
36b10 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
36b20 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
36b30 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20  s of.    **     
36b40 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   cells stored on
36b50 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
36b60 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  es may need to b
36b70 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
36b80 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66  *.    **   4) If
36b90 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
36ba0 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
36bb0 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
36bc0 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a  , then any.    *
36bd0 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20  *      overflow 
36be0 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68  pages used by th
36bf0 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65  ese cells may ne
36c00 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
36c10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e  .    **      (in
36c20 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
36c30 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  des never contai
36c40 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76  n pointers to ov
36c50 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20  erflow pages).. 
36c60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35     **.    **   5
36c70 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
36c80 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
36c90 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
36ca0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
36cb0 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20  **      entries 
36cc0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68  for the right-ch
36cd0 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63  ild pages of eac
36ce0 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65  h sibling may ne
36cf0 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  ed.    **      t
36d00 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
36d10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65    **.    ** Case
36d20 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
36d30 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
36d40 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
36d50 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
36d60 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63  ock deals with c
36d70 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64  ases 3 and 4 and
36d80 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74   the one after t
36d90 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e  hat, case 5. Sin
36da0 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  ce.    ** settin
36db0 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  g a pointer map 
36dc0 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74  entry is a relat
36dd0 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
36de0 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a  operation, this.
36df0 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79      ** code only
36e00 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61   sets pointer ma
36e10 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
36e20 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
36e30 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
36e40 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
36e50 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61  moved between pa
36e60 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ges.  */.    Mem
36e70 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
36e80 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61  ew[0];.    MemPa
36e90 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
36ea0 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f  y[0];.    int nO
36eb0 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
36ec0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
36ed0 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f  nt iNextOld = pO
36ee0 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65  ld->nCell + nOve
36ef0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
36f00 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65  Overflow = (nOve
36f10 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 69  rflow ? pOld->ai
36f20 4f 76 66 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20  Ovfl[0] : -1);. 
36f30 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
36f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f50 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
36f60 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
36f70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
36f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36fa0 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
36fb0 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
36fc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
36fd0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
36fe0 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d   int isDivider =
36ff0 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
37000 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a   i==iNextOld ){.
37010 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
37020 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
37030 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
37040 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
37050 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20  l on old.       
37060 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
37070 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   j. If the sibli
37080 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
37090 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
370a0 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
370b0 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
370c0 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72   i was a divider
370d0 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
370e0 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20    assert( j+1 < 
370f0 41 72 72 61 79 53 69 7a 65 28 61 70 43 6f 70 79  ArraySize(apCopy
37100 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
37110 65 72 74 28 20 6a 2b 31 20 3c 20 6e 4f 6c 64 20  ert( j+1 < nOld 
37120 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20  );.        pOld 
37130 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20  = apCopy[++j];. 
37140 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20         iNextOld 
37150 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
37160 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  + pOld->nCell + 
37170 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
37180 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c  .        if( pOl
37190 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
371a0 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66            nOverf
371b0 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
371c0 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  rflow;.         
371d0 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b   iOverflow = i +
371e0 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
371f0 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20  d->aiOvfl[0];.  
37200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37210 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61  isDivider = !lea
37220 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d  fData;  .      }
37230 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ..      assert(n
37240 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f  Overflow>0 || iO
37250 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20  verflow<i );.   
37260 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
37270 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61  low<2 || pOld->a
37280 69 4f 76 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e  iOvfl[0]==pOld->
37290 61 69 4f 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20  aiOvfl[1]-1);.  
372a0 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
372b0 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<3 || pOld->
372c0 61 69 4f 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d  aiOvfl[1]==pOld-
372d0 3e 61 69 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20  >aiOvfl[2]-1);. 
372e0 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65       if( i==iOve
372f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
37300 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a   isDivider = 1;.
37310 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e          if( (--n
37320 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20  Overflow)>0 ){. 
37330 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
37340 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow++;.        }.
37350 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
37360 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20  f( i==cntNew[k] 
37370 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
37380 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
37390 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
373a0 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
373b0 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20  cell on new.    
373c0 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
373d0 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69  age k. If the si
373e0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
373f0 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
37400 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
37410 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
37420 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64  ell i is a divid
37430 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  er cell.  */.   
37440 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
37450 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  w[++k];.        
37460 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20  if( !leafData ) 
37470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
37480 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
37490 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20  j<nOld );.      
374a0 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29  assert( k<nNew )
374b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
374c0 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67  he cell was orig
374d0 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63  inally divider c
374e0 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20  ell (and is not 
374f0 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a  now) or.      **
37500 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
37510 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c  l, or if the cel
37520 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  l was located on
37530 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62   a different sib
37540 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61  ling.      ** pa
37550 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  ge before the ba
37560 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68  lancing, then th
37570 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
37580 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
37590 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61  .      ** with a
375a0 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  ny child or over
375b0 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20  flow pages need 
375c0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20  to be updated.  
375d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
375e0 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e  ivider || pOld->
375f0 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
37600 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
37610 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
37620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  ){.          ptr
37630 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
37640 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c  byte(apCell[i]),
37650 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
37660 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
37670 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37680 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d     if( szCell[i]
37690 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
376a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  ){.          ptr
376b0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
376c0 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26  ew, apCell[i], &
376d0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
376e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
376f0 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
37700 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66  ction ){.      f
37710 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
37720 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33  i++){.        u3
37730 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65  2 key = get4byte
37740 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74  (&apNew[i]->aDat
37750 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  a[8]);.        p
37760 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65  trmapPut(pBt, ke
37770 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  y, PTRMAP_BTREE,
37780 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c   apNew[i]->pgno,
37790 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
377a0 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20     }..#if 0.    
377b0 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65  /* The ptrmapChe
377c0 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69  ckPages() contai
377d0 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ns assert() stat
377e0 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69  ements that veri
377f0 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  fy that.    ** a
37800 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ll pointer map p
37810 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72  ages are set cor
37820 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20  rectly. This is 
37830 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20  helpful while . 
37840 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e     ** debugging.
37850 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
37860 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73   disabled becaus
37870 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  e a corrupt data
37880 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  base may.    ** 
37890 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28  cause an assert(
378a0 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66  ) statement to f
378b0 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72  ail.  */.    ptr
378c0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70  mapCheckPages(ap
378d0 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  New, nNew);.    
378e0 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
378f0 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23  (&pParent, 1);.#
37900 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73  endif.  }..  ass
37910 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
37920 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28  Init );.  TRACE(
37930 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
37940 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d  hed: old=%d new=
37950 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
37960 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20            nOld, 
37970 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a  nNew, nCell));..
37980 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
37990 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
379a0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
379b0 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
379c0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
379d0 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
379e0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
379f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
37a00 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
37a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
37a20 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
37a30 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
37a40 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ]);.  }..  retur
37a50 6e 20 72 63 3b 0a 7d 0a 23 69 66 20 64 65 66 69  n rc;.}.#if defi
37a60 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
37a70 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30   _MSC_VER >= 170
37a80 30 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f  0 && defined(_M_
37a90 41 52 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74  ARM).#pragma opt
37aa0 69 6d 69 7a 65 28 22 22 2c 20 6f 6e 29 0a 23 65  imize("", on).#e
37ab0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
37ac0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
37ad0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
37ae0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
37af0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
37b00 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
37b10 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
37b20 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
37b30 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
37b40 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
37b50 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
37b60 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
37b70 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
37b80 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
37b90 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
37ba0 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
37bb0 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
37bc0 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
37bd0 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
37be0 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
37bf0 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
37c00 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
37c10 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
37c20 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
37c30 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
37c40 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
37c50 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
37c60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
37c70 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
37c80 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
37c90 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
37ca0 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
37cb0 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
37cc0 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
37cd0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
37ce0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
37cf0 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
37d00 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
37d10 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
37d20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
37d30 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
37d40 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
37d50 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
37d60 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
37d70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
37d80 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
37d90 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
37da0 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
37db0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
37dc0 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
37dd0 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
37de0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
37df0 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
37e00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
37e10 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
37e20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
37e30 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
37e40 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
37e50 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
37e60 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
37e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
37e90 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
37ea0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
37eb0 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
37ec0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
37ed0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
37ee0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
37ef0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
37f00 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
37f10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
37f20 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
37f30 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
37f40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
37f50 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
37f60 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
37f70 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
37f80 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
37f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37fa0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
37fb0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
37fc0 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
37fd0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
37fe0 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
37ff0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
38000 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
38010 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
38020 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
38030 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
38040 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
38050 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
38060 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
38070 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
38080 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
38090 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
380a0 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
380b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
380c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
380d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
380e0 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
380f0 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
38100 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
38110 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
38120 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
38130 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
38140 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
38150 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
38160 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
38170 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
38180 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
38190 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
381a0 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
381b0 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
381c0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
381d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
381e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
381f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
38200 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
38210 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
38220 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
38230 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
38240 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
38250 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
38260 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
38270 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
38280 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
38290 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
382a0 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
382b0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
382c0 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
382d0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
382e0 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
382f0 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
38300 28 70 43 68 69 6c 64 2d 3e 61 69 4f 76 66 6c 2c  (pChild->aiOvfl,
38310 20 70 52 6f 6f 74 2d 3e 61 69 4f 76 66 6c 2c 0a   pRoot->aiOvfl,.
38320 20 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e           pRoot->
38330 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
38340 28 70 52 6f 6f 74 2d 3e 61 69 4f 76 66 6c 5b 30  (pRoot->aiOvfl[0
38350 5d 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  ]));.  memcpy(pC
38360 68 69 6c 64 2d 3e 61 70 4f 76 66 6c 2c 20 70 52  hild->apOvfl, pR
38370 6f 6f 74 2d 3e 61 70 4f 76 66 6c 2c 0a 20 20 20  oot->apOvfl,.   
38380 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f 76        pRoot->nOv
38390 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
383a0 6f 6f 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  oot->apOvfl[0]))
383b0 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
383c0 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e  rflow = pRoot->n
383d0 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20  Overflow;..  /* 
383e0 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  Zero the content
383f0 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e  s of pRoot. Then
38400 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20   install pChild 
38410 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  as the right-chi
38420 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67  ld. */.  zeroPag
38430 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d  e(pRoot, pChild-
38440 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
38450 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
38460 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
38470 5b 70 52 6f 6