/ Hex Artifact Content
Login

Artifact 33265f923a6bcbc035a0914699ab312b93584791:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
65f0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6600: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6610: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6620: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6630: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6640: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6650: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6660: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6670: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6680: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6690: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
66a0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
66b0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
66c0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
66d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
66e0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
66f0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
6700: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6710: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6720: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6730: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6740: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6750: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6770: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6780: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
67a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
67c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
67d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
67e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
67f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
6800: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6810: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6820: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6840: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6850: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6860: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6880: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6890: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
68a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
68b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
68c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
68d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
68e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
68f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6900: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6910: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6920: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6930: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6940: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6960: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6970: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
69a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
69b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
69c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
69d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
69f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6a00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6a10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6a20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6a40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6a50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6a60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6a70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6a80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6a90: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6aa0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
6ab0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
6ac0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
6ad0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
6ae0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
6af0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
6b00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b10: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b20: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6b30: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6b50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b70: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6b80: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6b90: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6ba0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
6bb0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
6bc0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6bd0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6be0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6bf0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6c00: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6c10: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6c20: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6c30: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6c40: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6c50: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6c60: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6c70: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6c80: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6ca0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6cb0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6cc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6cd0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6ce0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6cf0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6d00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6d10: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6d20: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6d30: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6d40: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6d50: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6d60: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6d70: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6d80: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6d90: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6da0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6db0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6dc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6dd0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6de0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6df0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6e00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6e10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6e30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6e40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6e50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6e60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6e70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6e80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6e90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6ea0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6eb0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6ec0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6ed0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6ef0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6f00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6f10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6f20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6f30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6f50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6f60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6f70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6f80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6fa0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6fb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6fc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6fd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6fe0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ff0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7000: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7010: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7020: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
7030: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
7040: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
7050: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
7060: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
7070: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
7080: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7090: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
70a0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
70b0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
70c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
70d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
70e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
70f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7100: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
7150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
7160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
7180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
71a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
71b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
71c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
71e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
71f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
7240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
7280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
72b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
72c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
72d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
72e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
72f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
73a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
73b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
73c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
73d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
73e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
73f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7470: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7480: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7490: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
74a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
74b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
74c0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
74d0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
74e0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
74f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7500: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7510: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7520: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7530: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7540: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7550: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7560: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
7570: 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  ( (pInfo->nSize 
7580: 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f  = (u16)(n+nPaylo
7590: 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  ad))<4 ) pInfo->
75a0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
75b0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
75c0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
75d0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
75e0: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
75f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7600: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
7610: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
7620: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7630: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
7640: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
7650: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
7660: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7670: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7680: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7690: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
76a0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
76b0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
76c0: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
76d0: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
76e0: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
76f0: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7700: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
7710: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
7720: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
7730: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
7740: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
7750: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
7760: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7770: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7780: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7790: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
77a0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
77b0: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
77c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
77d0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
77e0: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
77f0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7800: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7810: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
7820: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
7830: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7840: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7850: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
7860: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7870: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7880: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7890: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
78a0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
78b0: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
78c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
78d0: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
78e0: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
78f0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7900: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7910: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
7920: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7930: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
7940: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7950: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
7960: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
7970: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7980: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7990: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
79a0: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
79b0: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
79c0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
79d0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
79e0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
79f0: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7a00: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7a10: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
7a20: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
7a30: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
7a40: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
7a50: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
7a60: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
7a70: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7a80: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7a90: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7aa0: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7ab0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7ac0: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7ad0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7ae0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7af0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7b00: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7b20: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
7b30: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
7b40: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7b60: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7b70: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7b80: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7b90: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7ba0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7bb0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7bc0: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7bd0: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7be0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7bf0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7c00: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7c10: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
7c20: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7c30: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
7c40: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
7c50: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
7c60: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
7c70: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7c80: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7c90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7ca0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7cb0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7cc0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7cd0: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7ce0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7cf0: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7d00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7d10: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7d20: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7d30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7d40: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7d50: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7d60: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7d70: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7d80: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7d90: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7da0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7db0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7dc0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7dd0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7de0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7df0: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7e00: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7e10: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7e20: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7e30: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7e40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7e50: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7e60: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7e70: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7e80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7e90: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7ea0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7eb0: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7ec0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7ed0: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7ef0: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7f00: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7f10: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7f20: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7f30: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7f40: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7f50: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7f60: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
7f70: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
7f80: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
7f90: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
7fa0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
7fb0: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
7fc0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
7fd0: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
7fe0: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
7ff0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8000: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8010: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
8020: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
8030: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
8040: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8050: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8060: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8080: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8090: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
80a0: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
80b0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
80c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
80d0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
80e0: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
80f0: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8100: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8110: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8120: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
8130: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
8140: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8150: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
8160: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8170: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8180: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8190: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
81a0: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
81b0: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
81c0: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
81d0: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
81e0: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
81f0: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8200: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
8210: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
8220: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
8230: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
8240: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
8250: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
8260: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8270: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8280: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8290: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
82a0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
82b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
82c0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
82d0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
82e0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
82f0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8300: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
8310: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
8320: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
8330: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
8340: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
8350: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8360: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8370: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8380: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8390: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
83a0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
83b0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
83c0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
83d0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
83e0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
83f0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8400: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
8410: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
8420: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
8430: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
8440: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
8450: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8460: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8470: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8480: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8490: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
84a0: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
84b0: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
84c0: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
84d0: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
84e0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
84f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8500: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
8510: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
8520: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
8530: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
8540: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
8550: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
8560: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8570: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8580: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8590: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
85a0: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
85b0: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
85c0: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
85d0: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
85e0: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
85f0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8600: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
8610: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
8620: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
8630: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
8640: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
8650: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8660: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8670: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8680: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8690: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
86c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
86f0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8700: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
8710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8720: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
8730: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
8740: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
8750: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8760: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8770: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8790: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
87a0: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
87b0: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
87c0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
87d0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
87e0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
87f0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8810: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8820: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8830: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
8840: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8870: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8880: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8890: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
88a0: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
88b0: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
88c0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
88d0: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
88e0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
88f0: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
8900: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
8910: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
8920: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
8930: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
8940: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
8950: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
8960: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8970: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8980: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8990: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
89a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
89b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
89c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
89d0: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
89e0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
89f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8a00: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
8a10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8a20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8a30: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8a40: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8a50: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8a60: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8a70: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8a80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8a90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8aa0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8ab0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8ac0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8ad0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
8af0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
8b00: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
8b10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
8b20: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8b30: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8b40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8b50: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8b60: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8b70: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8b80: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8b90: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8ba0: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8bb0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8bc0: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8bd0: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8be0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
8bf0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8c00: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8c10: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8c20: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8c30: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8c40: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8c50: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8c60: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8c70: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8c80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8c90: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8ca0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8cc0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8cd0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8ce0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
8cf0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
8d00: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
8d10: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
8d20: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
8d30: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8d40: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8d50: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8d60: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8d70: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8d80: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8da0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8db0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8dc0: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8dd0: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8de0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8df0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8e00: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8e10: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8e20: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8e30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8e40: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8e50: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8e60: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8e70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8e80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8e90: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8ea0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8eb0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8ec0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ee0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8ef0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8f00: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8f10: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8f20: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8f30: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8f40: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8f50: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8f60: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
8f70: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8f80: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8f90: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8fa0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8fb0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8fc0: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8fd0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
8fe0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
8ff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9000: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
9010: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
9020: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
9030: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
9040: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
9050: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
9060: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9080: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9090: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
90a0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
90b0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
90c0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
90d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
90e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
90f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9100: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
9110: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
9120: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
9130: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
9140: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
9150: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
9160: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9170: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9180: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9190: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
91a0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
91b0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
91c0: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
91d0: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
91e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
91f0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9200: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
9210: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
9220: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
9230: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
9240: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
9250: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
9260: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9270: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9280: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9290: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
92a0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
92b0: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
92c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
92d0: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
92e0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
92f0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9300: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
9310: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
9320: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
9330: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
9340: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
9350: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
9360: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9370: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9380: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
93a0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
93b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
93c0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
93d0: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
93e0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
93f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9400: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
9410: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
9420: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
9430: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9440: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
9450: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9460: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9470: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
94a0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
94b0: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
94c0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
94f0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9500: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
9510: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
9520: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
9530: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
9540: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
9550: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
9560: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9570: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9580: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9590: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
95a0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
95b0: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
95c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
95d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
95e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
95f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9600: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
9610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9620: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9630: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9640: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
9650: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
9660: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9670: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9680: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9690: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
96a0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
96b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
96c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
96d0: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
96e0: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
96f0: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9700: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
9710: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9720: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
9730: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9740: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
9750: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9760: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9770: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9780: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9790: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
97a0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
97b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
97c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
97d0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
97e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
97f0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9800: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9810: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9820: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9830: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9840: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9850: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9860: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9870: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9880: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9890: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
98a0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
98b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
98c0: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
98d0: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
98e0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
98f0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
9900: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
9910: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
9920: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
9930: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
9940: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
9950: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
9960: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9970: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9980: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9990: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
99a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
99b0: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
99c0: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
99d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
99e0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
99f0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9a00: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9a10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9a20: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9a30: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9a40: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9a50: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9a60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9a70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9a90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9aa0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9ab0: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9ac0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9ad0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9ae0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9af0: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9b00: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9b10: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9b20: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9b30: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
9b40: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
9b50: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
9b60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
9b70: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
9b80: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
9b90: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
9ba0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9bb0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
9bc0: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
9bd0: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
9be0: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
9bf0: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
9c00: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
9c10: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
9c20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9c30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9c40: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
9c50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
9c60: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
9c70: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
9c80: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
9c90: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
9ca0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
9cb0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
9cc0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
9cd0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
9ce0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
9cf0: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
9d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d10: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
9d20: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9d40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9d50: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
9d60: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9d70: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
9d80: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
9d90: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
9da0: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
9db0: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
9dc0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
9dd0: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
9de0: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
9df0: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
9e00: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9e10: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9e20: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9e30: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9e40: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9e50: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9e60: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9e70: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9e80: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9e90: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9ea0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9eb0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9ec0: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9ed0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9ee0: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9ef0: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9f00: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9f10: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9f20: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9f30: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9f40: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9f50: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9f60: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
9f70: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
9f80: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
9f90: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
9fa0: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
9fb0: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
9fc0: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
9fd0: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
9fe0: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
9ff0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a010: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
a020: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a030: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
a040: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
a050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a060: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
a070: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
a080: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
a090: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
a0a0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
a0b0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
a0c0: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
a0d0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
a0e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
a0f0: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
a100: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
a110: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
a120: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
a130: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
a140: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
a150: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
a160: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a180: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a190: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a1a0: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a1b0: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a1c0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a1d0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a1f0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a200: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a210: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a220: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a230: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a240: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a260: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a270: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a280: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a290: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a2a0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a2b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a2c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a2d0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a2e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a2f0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a300: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a310: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a320: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a330: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a340: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a350: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a360: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a370: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a380: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a390: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a3a0: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a3b0: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a3c0: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a3d0: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a3e0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a3f0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a400: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a410: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a420: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a430: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a440: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a450: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a460: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a470: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a480: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a490: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a4a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a4b0: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a4c0: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a4d0: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a4e0: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a4f0: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a500: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a510: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a520: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a530: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a540: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a550: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a560: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a570: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a580: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a590: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a5a0: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a5b0: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a5c0: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a5d0: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a5e0: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a5f0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a600: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a610: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a620: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a630: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a640: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a650: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a660: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a670: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a680: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a690: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a6a0: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a6b0: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a6c0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a6f0: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a700: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a710: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a730: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a740: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a750: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a760: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a770: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a780: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a790: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a7a0: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a7b0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a7c0: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a7d0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a7e0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a7f0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a800: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a810: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a820: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a830: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a840: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a850: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a860: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a870: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a880: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a890: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a8a0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a8b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a8c0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a8e0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a8f0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a900: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a910: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a920: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a930: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a940: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a950: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a960: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
a970: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
a980: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
a990: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
a9a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a9b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
a9d0: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
a9e0: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
a9f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa00: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
aa10: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
aa20: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
aa30: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
aa40: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
aa50: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
aa60: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
aa70: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
aa80: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
aa90: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
aaa0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
aab0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
aac0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
aad0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
aae0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
aaf0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ab00: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
ab10: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
ab20: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
ab30: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
ab40: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
ab50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
ab60: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ab70: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ab80: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ab90: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
aba0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
abb0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
abc0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
abd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
abe0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
abf0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ac00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ac10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ac20: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
ac30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ac40: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ac50: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
ac60: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ac70: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ac80: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ac90: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
aca0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
acb0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
acc0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
acd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ace0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
acf0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ad00: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ad10: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
ad20: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
ad30: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
ad40: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ad50: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
ad60: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ad70: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ad80: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ad90: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ada0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
adb0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
adc0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
add0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ade0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
adf0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ae00: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
ae10: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
ae20: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
ae50: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
ae60: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
ae70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ae80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ae90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
aea0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
aeb0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
aec0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
aed0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
aee0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
aef0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
af00: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
af10: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
af20: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
af30: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
af40: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
af50: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
af60: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
af70: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
af80: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
af90: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
afa0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
afb0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
afc0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
afd0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
afe0: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
aff0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b000: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b010: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b020: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b030: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b040: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b050: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b060: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b070: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b080: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b0a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b0b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b0d0: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b0e0: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b0f0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b100: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b110: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b120: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b130: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b140: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b150: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b160: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b170: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b180: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b190: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b1a0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b1b0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b1c0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b1d0: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b1e0: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b1f0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b200: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b210: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b230: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b240: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b250: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b260: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b270: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b280: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b290: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b2a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b2b0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b2c0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b2d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b2e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b2f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b300: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b310: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b320: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b330: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b340: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b350: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b360: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b370: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b390: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b3a0: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b3b0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b3c0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b3d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b3e0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b3f0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b400: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b410: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b420: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b430: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b440: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b450: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b460: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b470: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b480: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b490: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b4a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b4b0: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b4c0: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b4d0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b4e0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b4f0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b500: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b510: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b520: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b530: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b540: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b550: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b560: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b570: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b580: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b590: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b5a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b5b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b5c0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b5d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b5e0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b5f0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b600: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b610: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b620: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b630: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b640: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b650: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b660: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b670: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b680: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b690: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b6a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b6b0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b6c0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b6d0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b6e0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b6f0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b700: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b710: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b720: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b730: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b740: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b750: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b760: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b770: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b780: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b790: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b7a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b7b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b7c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b7d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b7e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b7f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b800: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b810: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b820: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b830: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b860: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b870: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b880: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b890: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b8a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b8b0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b8c0: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b8d0: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b8e0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b8f0: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b900: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b910: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b920: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b930: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b940: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b950: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b960: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
b970: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
b980: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
b990: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
b9a0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
b9b0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
b9c0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
b9d0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
b9e0: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
b9f0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
ba00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
ba10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
ba20: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
ba30: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
ba40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
ba50: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
ba60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
ba70: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
ba80: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
ba90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
baa0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bab0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bac0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bae0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
baf0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bb00: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bb10: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bb20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bb30: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bb40: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bb50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bb60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bb70: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bb80: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bb90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bba0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bbb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bbc0: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bbd0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bbe0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bbf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc00: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bc10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc20: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bc40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bc50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bc60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bc70: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bc80: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bc90: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bca0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bcb0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bcc0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bcd0: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bce0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bcf0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
bd00: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
bd10: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
bd20: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bd30: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bd40: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bd50: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bd60: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
bd70: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
bd80: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
bd90: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bda0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bdb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bdc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bdd0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bde0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bdf0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
be00: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
be10: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
be20: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
be30: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
be40: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
be50: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
be60: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
be70: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
be80: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
be90: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bea0: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
beb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bec0: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bee0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bf00: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bf10: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bf20: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bf30: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bf40: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bf50: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bf60: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bf70: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
bf80: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bf90: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
bfa0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bfb0: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
bfc0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bfd0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
bfe0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
bff0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c000: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c010: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c020: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c030: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c040: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c050: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c060: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c070: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c080: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c090: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c0a0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c0b0: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c0c0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c0d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c0e0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c0f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c100: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c110: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c120: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c130: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c140: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c150: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c180: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c190: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c1a0: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c1b0: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c1c0: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c1d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c1e0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c1f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c200: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c210: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c220: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c230: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c240: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c250: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c260: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c270: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c280: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c290: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c2a0: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c2b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c2c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c2d0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c2e0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c2f0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c300: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c310: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c320: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c330: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c340: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c350: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c360: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c370: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c380: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c390: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c3a0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c3b0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c3c0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c3d0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c3e0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c3f0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c400: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c410: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c420: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c430: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c440: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c450: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c460: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c470: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c480: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c490: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c4a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c4b0: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c4c0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c4d0: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c4e0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c4f0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c500: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c510: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c520: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c530: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c540: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c550: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c560: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c570: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c580: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c590: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c5a0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c5b0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c5c0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c5d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c5e0: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c5f0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c600: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c610: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c620: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c630: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c640: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c650: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c660: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c670: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c680: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c690: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c6a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c6b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c6c0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c6d0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c6e0: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c6f0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c700: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c710: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c720: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c730: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c740: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c750: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c760: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c770: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c780: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c790: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c7a0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c7b0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c7c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c7d0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c7e0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c7f0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c800: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c810: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c820: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c830: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c840: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c850: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c860: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c870: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c880: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c890: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c8a0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c8b0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c8c0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c8d0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c8e0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c8f0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c900: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c910: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c920: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c930: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c940: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c950: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c960: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
c970: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
c980: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
c990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c9a0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
c9b0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
c9c0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
c9d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
c9e0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
c9f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
ca00: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
ca10: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
ca20: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
ca30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
ca40: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
ca50: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
ca60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ca70: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
ca80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ca90: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
caa0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cab0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cac0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cad0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cae0: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
caf0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cb00: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cb10: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cb20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cb30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cb40: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cb50: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cb60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cb70: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cb80: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cb90: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cba0: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
cbb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbc0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cbd0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cbe0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
cbf0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cc00: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cc10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
cc20: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
cc30: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
cc40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cc50: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
cc60: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cc70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cc80: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cc90: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cca0: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
ccb0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
ccc0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
ccd0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cce0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
ccf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
cd10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
cd20: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
cd30: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
cd40: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
cd50: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
cd60: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
cd70: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
cd80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
cd90: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
cda0: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
cdb0: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
cdc0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
cdd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
cde0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
cdf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
ce00: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
ce10: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
ce20: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
ce30: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
ce40: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
ce50: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
ce60: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
ce70: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
ce80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
ce90: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cea0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
ceb0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cec0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
ced0: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cee0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cef0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
cf00: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
cf10: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
cf20: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
cf30: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
cf40: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
cf50: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
cf60: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
cf70: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
cf80: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
cf90: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
cfa0: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
cfb0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
cfc0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
cfd0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
cfe0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
cff0: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d000: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d010: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d020: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d030: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d040: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d060: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d070: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d080: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d090: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d0a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d0b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d0c0: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d0d0: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d0e0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d0f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d100: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d110: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d120: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d140: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d150: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d160: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d170: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d180: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d190: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d1b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d1c0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d1d0: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d1e0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d1f0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d200: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d210: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d230: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d240: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d250: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d260: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d270: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d280: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d290: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d2a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d2b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d2c0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d2d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d2e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d2f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d300: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d320: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d330: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d340: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d350: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d360: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d380: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d390: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d3a0: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d3b0: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d3c0: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d3d0: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d3e0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d3f0: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d400: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d410: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d420: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d430: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d440: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d460: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d470: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d480: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d490: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d4a0: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d4b0: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d4c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d4d0: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d4e0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d4f0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d500: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d510: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d520: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d530: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d540: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d550: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d560: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d570: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d590: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d5a0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d5b0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d5c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d5d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d5e0: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d5f0: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d600: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d610: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d620: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d630: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d640: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d650: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d660: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d680: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d690: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d6a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d6b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d6c0: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d6d0: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d6e0: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d6f0: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d700: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d710: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d720: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d730: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d740: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d750: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d760: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d770: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d780: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d790: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d7a0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d7b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d7c0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d7d0: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d7f0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d800: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d810: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d820: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d830: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d840: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d850: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d860: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d870: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d880: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d890: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d8a0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d8c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d8d0: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d8e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d8f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d900: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d910: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
d920: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
d930: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
d940: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
d950: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
d960: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
d970: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
d980: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
d990: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
d9a0: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
d9b0: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
d9c0: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
d9d0: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
d9e0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
d9f0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
da00: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
da10: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
da20: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
da30: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
da40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
da50: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
da60: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
da70: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
da80: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
da90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
daa0: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
dab0: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
dac0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
dad0: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
dae0: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
daf0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
db00: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
db10: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
db20: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
db30: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
db40: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
db50: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
db60: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
db70: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
db80: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
db90: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dba0: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dbb0: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dbc0: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dbd0: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dbe0: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dbf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dc00: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dc10: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dc20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dc30: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dc40: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dc50: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dc60: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dc70: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dc80: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dc90: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dca0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
dcb0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
dcc0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
dcd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dce0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
dcf0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
dd00: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
dd10: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
dd20: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
dd30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
dd40: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
dd50: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
dd60: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
dd70: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
dd80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
dd90: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
dda0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
ddb0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
ddc0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
ddd0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
dde0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
ddf0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
de00: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
de10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
de20: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
de30: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
de40: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
de50: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
de60: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
de70: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
de80: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
de90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dea0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
deb0: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
dec0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ded0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
dee0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
def0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
df00: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
df30: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
df40: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
df50: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
df60: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
df70: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
df80: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
df90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dfb0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
dfc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
dfd0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
e000: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
e010: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
e020: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
e030: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
e040: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
e050: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
e060: 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
e070: 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
e080: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
e090: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
e0a0: 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
e0b0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
e0c0: 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
e0d0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
e0e0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
e0f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
e100: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
e110: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
e120: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
e130: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
e140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
e150: 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
e160: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
e170: 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
e180: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
e190: 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
e1a0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
e1b0: 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
e1e0: 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
e1f0: 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a 23 65  nMemory(db));.#e
e200: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
e210: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
e220: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e230: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
e240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
e250: 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
e260: 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
e270: 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
e280: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
e290: 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
e2a0: 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
e2b0: 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
e2c0: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
e2d0: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e2e0: 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
e2f0: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
e300: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
e310: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e320: 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
e330: 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
e340: 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
e350: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e360: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
e370: 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
e380: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
e390: 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64   & SQLITE_NoRead
e3a0: 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 66 6c 61 67  lock ){.    flag
e3b0: 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45  s |= BTREE_NO_RE
e3c0: 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66  ADLOCK;.  }.  if
e3d0: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
e3e0: 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
e3f0: 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
e400: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
e410: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e420: 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
e430: 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
e440: 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
e450: 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
e460: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e470: 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
e480: 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
e490: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
e4a0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e4b0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e4c0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e4d0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e4e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e4f0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e500: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e510: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e530: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e540: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e550: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e560: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e570: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e580: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e590: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e5a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e5b0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e5c0: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e5d0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e5e0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e5f0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e600: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e610: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e620: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e630: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e640: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 69 73 54  sMemdb==0 && isT
e650: 65 6d 70 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  empDb==0 ){.    
e660: 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
e670: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
e680: 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
e690: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
e6a0: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
e6b0: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
e6c0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
e6d0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
e6e0: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
e6f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e700: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
e710: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
e720: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
e730: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
e740: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
e750: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e760: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e770: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e780: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e790: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e7a0: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e7b0: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e7c0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e7d0: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
e7e0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e7f0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e800: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
e810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e820: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
e830: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
e840: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
e850: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e860: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e870: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
e880: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e890: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
e8a0: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
e8b0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e8c0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e8d0: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
e8e0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
e8f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e900: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
e910: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
e920: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
e930: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
e940: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
e950: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
e960: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e970: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
e980: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
e990: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
e9a0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
e9b0: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
e9c0: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
e9e0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
e9f0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
ea00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
ea10: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
ea20: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
ea30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ea40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ea50: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
ea60: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
ea70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ea80: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
ea90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
eaa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
eab0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ead0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
eae0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
eaf0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
eb00: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
eb10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
eb20: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
eb30: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
eb40: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
eb50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
eb60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
eb80: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
eb90: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
eba0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
ebb0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ebc0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
ebd0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
ebe0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
ebf0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
ec00: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
ec10: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
ec20: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
ec30: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
ec40: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
ec50: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
ec60: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
ec70: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
ec80: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
ec90: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
eca0: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
ecb0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ecc0: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
ecd0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
ece0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
ecf0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
ed00: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
ed10: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
ed20: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
ed30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
ed40: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
ed50: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
ed60: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
ed70: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
ed80: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
ed90: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
eda0: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
edb0: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
edc0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
edd0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
ede0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
edf0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
ee00: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
ee10: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
ee20: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
ee30: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
ee40: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
ee50: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
ee60: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
ee70: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
ee80: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
ee90: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
eea0: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
eeb0: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
eec0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
eed0: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
eee0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
eef0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
ef00: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
ef10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
ef20: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
ef30: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ef40: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
ef50: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
ef60: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
ef90: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
efa0: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
efb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
efc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
efd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
efe0: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
eff0: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f000: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f010: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f020: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f040: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f060: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f070: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f080: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f090: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f0a0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f0b0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f0c0: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f0d0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f0e0: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f0f0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f100: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f110: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
f120: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
f130: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
f140: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66  Bt->pPager);.#if
f150: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
f160: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
f170: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
f180: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   1;.#endif.    p
f190: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f1a0: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
f1b0: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
f1c0: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
f1d0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
f1e0: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
f1f0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
f200: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
f210: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
f220: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
f230: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
f240: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f250: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
f260: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f270: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
f280: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
f290: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
f2a0: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
f2b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
f2c0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
f2d0: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
f2e0: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
f2f0: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
f300: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
f310: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
f320: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
f330: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
f340: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
f350: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
f360: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
f370: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
f380: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
f390: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
f3a0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
f3b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
f3c0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
f3d0: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
f3e0: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
f3f0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
f400: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
f410: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
f420: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
f430: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f440: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
f450: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
f460: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
f470: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f480: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
f490: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f4a0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
f4b0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f4c0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
f4d0: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
f4e0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f4f0: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
f500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f510: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f520: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f530: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
f540: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
f550: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
f560: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f570: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f580: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
f590: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f5a0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f5b0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f5c0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f5d0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f5e0: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
f5f0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f600: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f610: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
f620: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f630: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f640: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
f650: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
f660: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
f670: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
f680: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
f690: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f6a0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f6b0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f6c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f6d0: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
f6e0: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
f6f0: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
f700: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
f710: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
f720: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f730: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f740: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f750: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
f760: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
f770: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
f780: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
f790: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f7a0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f7b0: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66  ASTER);.      if
f7c0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
f7d0: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
f7e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
f7f0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
f800: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
f810: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f820: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
f830: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
f840: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
f850: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f860: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f870: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
f880: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
f890: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
f8a0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f8d0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
f8e0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
f8f0: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
f900: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f910: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f920: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
f930: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f940: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f950: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
f960: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f970: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
f980: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f990: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
f9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
f9b0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
f9c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f9d0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
f9e0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
f9f0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
fa00: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
fa10: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
fa20: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
fa30: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
fa40: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
fa50: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
fa60: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
fa70: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
fa80: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fa90: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
faa0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
fab0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
fac0: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
fad0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
fae0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
faf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
fb00: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
fb10: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
fb20: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fb30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
fb40: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
fb50: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
fb60: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
fb70: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
fb80: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
fb90: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
fba0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
fbb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
fbc0: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
fbd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fbe0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
fbf0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
fc00: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
fc10: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
fc20: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
fc30: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
fc40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fc50: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
fc60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
fc70: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
fc80: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
fc90: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
fca0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fcb0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
fcc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fcd0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
fce0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
fcf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fd00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fd10: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
fd20: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
fd30: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
fd40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fd50: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
fd60: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
fd70: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
fd80: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
fd90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fda0: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
fdb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fdc0: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
fdd0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
fde0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
fdf0: 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
fe00: 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
fe10: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
fe20: 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
fe30: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
fe40: 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
fe50: 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
fe60: 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
fe70: 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
fe80: 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
fe90: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
fea0: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
feb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
fec0: 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
fed0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
fee0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
fef0: 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
ff00: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
ff10: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
ff20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
ff30: 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
ff40: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
ff50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
ff60: 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
ff70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ff80: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
ff90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ffa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
ffb0: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
ffc0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
ffd0: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
ffe0: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
fff0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
10000 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
10010 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
10020 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
10030 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
10040 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
10050 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
10060 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
10070 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
10080 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
10090 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
100a0 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
100b0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
100c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
100d0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
100e0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
100f0 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
10100 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
10110 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
10120 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10130 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
10140 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
10150 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
10160 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10170 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10180 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
10190 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
101a0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
101b0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
101c0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
101d0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
101e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
101f0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
10200 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
10210 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10220 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10230 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
10240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10250 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
10260 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10270 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10280 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10290 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
102a0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
102b0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
102c0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
102d0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
102e0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
102f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
10300 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
10310 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
10320 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
10330 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10340 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10350 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
10360 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10370 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10380 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10390 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
103a0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
103b0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
103c0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
103d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
103e0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
103f0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
10400 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
10410 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
10420 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
10430 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
10440 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
10450 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10460 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10470 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10480 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10490 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
104a0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
104b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
104c0 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
104d0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
104e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
104f0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
10500 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
10510 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
10520 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
10530 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10540 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
10550 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
10560 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10570 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10590 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
105a0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
105b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
105c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
105d0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
105e0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
105f0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
10600 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
10610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10620 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10630 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10640 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
10650 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
10660 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10670 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10680 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10690 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
106a0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
106b0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
106c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
106d0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
106e0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
106f0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
10700 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
10710 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
10720 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
10730 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
10740 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
10750 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
10760 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10770 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10780 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10790 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
107a0 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
107b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
107c0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
107d0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
107e0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
107f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10800 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
10810 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
10820 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
10830 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
10840 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
10850 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
10860 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10870 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10880 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10890 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
108a0 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
108b0 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
108c0 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
108d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
108e0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
108f0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10900 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10910 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10920 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10930 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
10940 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
10950 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
10960 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10970 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10980 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10990 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
109a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
109b0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
109c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
109d0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
109e0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
109f0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10a00 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10a20 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
10a30 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10a40 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10a50 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10a60 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10a80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10a90 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
10aa0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
10ab0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
10ac0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10ad0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
10ae0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10af0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10b00 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10b10 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10b20 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10b30 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10b50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10b60 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10b80 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
10b90 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
10ba0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
10bb0 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
10bc0 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
10bd0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
10be0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10bf0 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10c00 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10c10 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10c20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10c30 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10c40 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10c50 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10c60 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10c70 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10c80 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
10c90 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
10ca0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
10cb0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
10cc0 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
10cd0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
10ce0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10cf0 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10d00 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10d10 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10d20 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10d30 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10d40 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10d50 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10d60 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10d70 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10d80 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
10d90 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10da0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
10db0 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
10dc0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
10dd0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
10de0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10df0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10e00 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10e10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10e20 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10e30 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10e40 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10e50 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10e80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
10e90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10ea0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
10eb0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
10ec0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
10ed0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
10ee0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10f10 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10f20 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10f30 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10f40 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10f50 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10f60 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
10f70 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
10f80 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
10f90 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
10fa0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
10fb0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
10fc0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
10fd0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
10fe0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
10ff0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
11000 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
11010 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
11020 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11030 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11040 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11050 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11060 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11070 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11080 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11090 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
110a0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
110b0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
110c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
110d0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
110e0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
110f0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
11100 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11120 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11130 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11140 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11150 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11160 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11170 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11180 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11190 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
111a0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
111b0 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
111c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
111d0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
111e0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
111f0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
11200 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11210 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11220 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11230 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11240 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11250 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11260 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11270 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11280 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11290 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
112a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
112b0 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
112c0 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
112d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
112e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
112f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11300 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
11310 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11320 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11330 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11340 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11350 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11360 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11370 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11380 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11390 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
113a0 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
113b0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
113c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
113d0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
113e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
113f0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11400 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
11410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11420 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11430 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11440 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11450 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11460 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11470 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11490 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
114a0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
114b0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
114c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
114d0 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
114e0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
114f0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
11500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
11510 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
11520 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
11530 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
11540 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11550 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
11560 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
11570 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
11580 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
11590 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
115a0 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
115b0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
115c0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
115d0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
115e0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
115f0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
11600 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
11610 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
11620 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
11630 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
11640 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
11650 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
11660 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
11670 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
11680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11690 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
116a0 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
116b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
116c0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
116d0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
116e0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
116f0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
11700 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
11710 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
11720 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
11730 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
11740 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
11750 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
11760 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
11770 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
11780 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
11790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
117a0 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
117b0 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
117c0 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
117d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
117e0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
117f0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
11800 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
11810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11820 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
11830 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
11840 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
11850 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
11860 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11870 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
11880 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11890 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
118a0 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
118b0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
118c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
118d0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
118e0 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
118f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11900 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
11910 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11920 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
11930 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
11940 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
11950 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
11960 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
11970 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11980 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
11990 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
119a0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
119b0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
119c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
119d0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
119e0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
119f0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
11a00 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11a10 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11a20 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11a30 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11a40 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11a50 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
11a60 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
11a70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11a80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11a90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11aa0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11ab0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
11ac0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
11ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11ae0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11af0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
11b00 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11b10 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11b20 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11b30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11b50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11b60 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11b70 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11b80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11b90 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11ba0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
11bb0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
11bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11bd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11be0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
11bf0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
11c00 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11c10 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11c20 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11c30 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11c40 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11c50 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11c60 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11c80 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11c90 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11ca0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11cb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11cc0 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11cd0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
11ce0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
11cf0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11d00 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11d10 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11d20 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11d30 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11d40 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11d50 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11d60 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11d70 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11d80 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11d90 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11da0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11db0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11dc0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11de0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
11df0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11e00 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11e20 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
11e30 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11e40 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11e50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11e70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11e80 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
11e90 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
11ea0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
11eb0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
11ec0 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
11ed0 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
11ee0 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
11ef0 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
11f00 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44 65   of the secureDe
11f10 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
11f20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
11f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f40 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
11f50 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11f60 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
11f70 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
11f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
11f90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11fa0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
11fb0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
11fc0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
11fd0 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
11fe0 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
11ff0 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
12000 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
12010 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12020 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
12030 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12040 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
12050 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
12060 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12070 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
12080 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12090 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
120a0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
120b0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
120c0 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
120d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
120e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
120f0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
12100 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
12110 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
12120 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
12130 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
12140 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
12150 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
12160 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
12170 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12180 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
12190 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
121a0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
121b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
121c0 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
121d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
121e0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
121f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12200 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
12210 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12230 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
12240 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
12250 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12260 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12270 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12280 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
12290 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
122a0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
122b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
122c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
122d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
122e0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
122f0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
12300 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
12310 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12320 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12330 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
12340 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12350 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12360 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12370 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
12380 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12390 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
123a0 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
123b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
123c0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
123d0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
123e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
123f0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
12400 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
12410 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
12420 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
12430 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12440 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
12450 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12460 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
12470 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
12480 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12490 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
124a0 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
124b0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
124c0 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
124d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
124e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
124f0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
12500 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
12510 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
12520 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
12530 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
12540 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
12550 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
12560 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
12570 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
12580 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12590 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
125a0 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
125b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
125c0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
125d0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
125e0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
125f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
12600 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
12610 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
12620 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12630 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12640 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12650 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12660 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12670 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12690 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
126a0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
126b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
126c0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
126d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
126e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
126f0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
12700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12710 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12720 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12730 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12740 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12750 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12760 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12770 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12780 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12790 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
127a0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
127b0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
127c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
127d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
127e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
127f0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
12800 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12810 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
12820 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
12830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12840 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
12850 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
12860 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
12870 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
12880 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12890 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
128a0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
128b0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
128c0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
128d0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
128e0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
128f0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12900 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
12910 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
12920 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
12930 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12940 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
12950 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
12960 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
12970 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
12980 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12990 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
129a0 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
129b0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
129c0 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
129d0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
129e0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
129f0 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12a00 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12a10 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12a20 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12a30 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12a40 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12a50 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12a60 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
12a70 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12a80 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12aa0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
12ab0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12ac0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12ad0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12ae0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12af0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12b00 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12b10 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
12b20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12b30 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
12b40 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12b50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12b60 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
12b70 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12b80 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12b90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
12ba0 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
12bb0 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
12bc0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
12bd0 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
12be0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
12bf0 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
12c00 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
12c10 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
12c20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
12c30 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
12c40 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
12c50 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
12c60 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
12c70 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
12c80 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
12c90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12ca0 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
12cb0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
12cc0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
12cd0 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
12ce0 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
12cf0 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
12d00 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
12d10 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
12d20 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
12d30 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
12d40 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
12d50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
12d60 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d  1[19]==2 && pBt-
12d70 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20  >doNotUseWAL==0 
12d80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
12d90 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
12da0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12db0 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
12dc0 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
12dd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12df0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12e00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
12e10 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
12e20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
12e30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
12e40 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
12e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12e60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
12e70 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
12e80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
12e90 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
12ea0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
12eb0 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
12ec0 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
12ed0 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
12ee0 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
12ef0 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
12f00 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
12f10 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
12f20 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
12f30 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
12f40 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
12f50 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
12f60 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
12f70 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
12f80 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
12f90 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
12fa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
12fb0 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
12fc0 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
12fd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
12fe0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12ff0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13000 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
13010 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
13020 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
13030 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
13040 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
13050 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
13060 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
13070 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
13080 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
13090 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
130a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
130b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
130c0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
130d0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
130e0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
130f0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
13100 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
13110 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
13120 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
13130 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
13140 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
13150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
13160 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
13170 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
13180 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
13190 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
131a0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
131b0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
131c0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
131d0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
131e0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
131f0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
13200 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
13210 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
13220 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
13230 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
13240 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
13250 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
13260 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
13270 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13280 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
13290 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
132a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
132b0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
132c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
132d0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
132e0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
132f0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
13300 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
13310 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
13320 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
13330 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
13360 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
13370 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
13390 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
133a0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
133b0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
133c0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
133d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
133e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
133f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13400 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13410 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
13420 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
13430 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13440 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13450 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13460 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
13470 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13480 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
13490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
134a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
134b0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
134c0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
134d0 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
134e0 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
134f0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
13500 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
13510 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
13520 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
13530 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
13540 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
13550 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
13560 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
13570 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
13580 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
13590 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
135a0 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
135b0 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
135c0 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
135d0 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
135e0 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
135f0 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
13600 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
13610 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
13620 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
13630 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
13640 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
13650 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
13660 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
13670 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
13680 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
13690 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
136a0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
136b0 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
136c0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
136d0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
136e0 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
136f0 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
13700 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
13710 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
13720 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
13730 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
13740 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
13750 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
13760 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
13770 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
13780 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
13790 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
137a0 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
137b0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
137c0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
137d0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
137e0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
137f0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
13800 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
13810 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
13820 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
13830 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
13840 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
13850 20 32 33 29 3b 0a 20 20 61 73 73 65 72 74 28 20   23);.  assert( 
13860 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
13870 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
13880 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
13890 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
138a0 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
138b0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
138c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
138d0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
138e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
138f0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
13900 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
13910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13920 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
13930 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
13940 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
13950 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
13960 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
13970 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
13980 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
13990 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
139a0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
139b0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
139c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
139d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
139e0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
139f0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
13a00 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
13a10 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13a20 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
13a30 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
13a40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13a50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13a60 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
13a70 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
13a80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
13a90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13aa0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
13ab0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13ac0 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  t( pBt->pCursor=
13ad0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
13ae0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
13af0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
13b00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13b10 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
13b20 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
13b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13b40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
13b50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13b60 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
13b70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
13b80 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
13b90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
13ba0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
13bb0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
13bc0 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
13bd0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
13be0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
13bf0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
13c00 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
13c10 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
13c20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
13c30 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
13c40 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
13c50 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
13c60 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
13c70 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
13c80 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
13c90 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13ca0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
13cb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13cc0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
13cd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13ce0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
13cf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
13d00 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
13d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
13d30 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
13d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
13d50 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
13d60 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
13d70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
13d80 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
13d90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
13da0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
13db0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
13dc0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
13dd0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
13de0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
13df0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
13e00 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
13e10 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
13e20 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
13e30 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
13e40 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
13e50 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
13e60 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
13e70 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
13e80 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
13e90 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
13ea0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
13eb0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
13ec0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
13ed0 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
13ee0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
13ef0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
13f00 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
13f10 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
13f20 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
13f30 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
13f40 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
13f50 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
13f60 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
13f70 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
13f80 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70  DATA );.  pBt->p
13f90 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
13fa0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13fb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13fc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13fd0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
13fe0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13ff0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
14000 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14010 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
14020 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
14030 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
14040 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
14050 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
14060 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
14070 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
14080 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
14090 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
140a0 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
140b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
140c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
140d0 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
140e0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
140f0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
14100 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
14110 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
14120 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
14130 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
14140 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
14150 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
14160 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14170 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
14180 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
14190 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
141a0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
141b0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
141c0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
141d0 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
141e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
141f0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
14200 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
14210 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
14220 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
14230 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
14240 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
14250 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
14260 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
14270 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
14280 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
14290 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
142a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
142b0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
142c0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
142d0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
142e0 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
142f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14300 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
14310 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
14320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14330 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
14340 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
14350 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
14360 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14370 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
14380 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
14390 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
143a0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
143b0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
143c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
143d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
143e0 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
143f0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
14400 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14410 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
14420 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
14430 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
14440 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
14450 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
14460 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
14470 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
14480 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
14490 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
144a0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
144b0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
144c0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
144d0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
144e0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
144f0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
14500 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
14510 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
14520 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
14530 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
14540 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
14550 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
14560 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
14570 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
14580 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
14590 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
145a0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
145b0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
145c0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
145d0 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
145e0 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
145f0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
14600 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
14610 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
14620 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
14630 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
14640 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
14650 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
14660 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
14670 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
14680 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14690 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
146a0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
146b0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
146c0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
146d0 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
146e0 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
146f0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
14700 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
14710 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
14720 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
14730 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
14740 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
14750 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
14760 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14770 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
14780 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
14790 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
147a0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
147b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
147c0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
147d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
147e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
147f0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
14800 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
14810 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
14820 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
14830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
14840 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
14850 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
14860 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
14870 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14880 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
14890 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
148a0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
148b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
148c0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
148d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
148e0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
148f0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
14900 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
14910 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
14920 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
14930 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
14940 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
14950 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
14960 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
14970 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14980 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14990 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
149a0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
149b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
149c0 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
149d0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
149e0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
149f0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
14a00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
14a10 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
14a20 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
14a30 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
14a40 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
14a50 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
14a60 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
14a70 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
14a80 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
14a90 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
14aa0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
14ab0 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e  E) || pBt->isPen
14ac0 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f  ding ){.    pBlo
14ad0 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
14ae0 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
14af0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
14b00 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
14b10 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
14b20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
14b30 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
14b40 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
14b50 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
14b60 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
14b70 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
14b80 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
14b90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14bb0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
14bc0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
14bd0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
14be0 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
14bf0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
14c00 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
14c10 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14c20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14c30 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
14c40 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
14c50 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
14c60 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
14c70 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
14c80 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
14c90 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
14ca0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
14cb0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
14cc0 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
14cd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
14ce0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
14cf0 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
14d00 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
14d10 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
14d20 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
14d30 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
14d40 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
14d50 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
14d60 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20  >initiallyEmpty 
14d70 3d 20 28 75 38 29 28 70 42 74 2d 3e 6e 50 61 67  = (u8)(pBt->nPag
14d80 65 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  e==0);.  do {.  
14d90 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
14da0 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
14db0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
14dc0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
14dd0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
14de0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
14df0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
14e00 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
14e10 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
14e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14e30 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
14e40 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
14e50 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
14e60 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
14e70 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
14e80 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
14e90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14ea0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
14eb0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
14ec0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
14ed0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
14ee0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
14ef0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
14f00 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
14f10 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
14f20 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
14f30 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
14f40 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
14f50 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
14f60 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
14f70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14f80 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
14f90 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
14fa0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
14fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
14fc0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
14fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
14fe0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
14ff0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
15000 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
15010 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
15020 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
15030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
15050 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
15060 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
15070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
15080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
150a0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
150b0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
150c0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
150d0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
150e0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
150f0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
15100 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
15110 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
15120 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
15130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15140 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
15150 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
15160 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
15170 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
15180 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15190 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
151a0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
151b0 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73  sharable ){..ass
151c0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
151d0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
151e0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
151f0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
15200 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
15210 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
15220 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
15230 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
15240 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
15250 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
15260 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
15270 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
15280 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
15290 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
152a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
152b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
152c0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
152d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
152e0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
152f0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
15300 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
15310 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
15320 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
15330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15340 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
15350 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
15360 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
15370 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
15380 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78  .      pBt->isEx
15390 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77  clusive = (u8)(w
153a0 72 66 6c 61 67 3e 31 29 3b 0a 23 65 6e 64 69 66  rflag>1);.#endif
153b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
153c0 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
153d0 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
153e0 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
153f0 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
15400 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
15410 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
15420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
15430 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
15440 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
15450 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
15460 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
15470 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
15480 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
15490 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
154a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
154b0 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
154c0 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
154d0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
154e0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
154f0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
15500 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
15510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15520 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
15530 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
15540 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
15550 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15560 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
15570 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
15580 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
155a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
155b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
155c0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
155d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
155e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
155f0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
15600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15610 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
15620 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
15630 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
15640 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
15650 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
15660 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
15670 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
15680 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
15690 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156a0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
156b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
156c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
156d0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
156e0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
156f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
15700 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
15710 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
15720 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
15730 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
15740 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
15750 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
15760 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15790 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
157a0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
157b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
157c0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
157d0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
157e0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
157f0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
15800 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
15810 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
15820 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
15830 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
15840 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
15850 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
15860 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
15870 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
15880 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
15890 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
158c0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
158d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158f0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
15900 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
15910 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
15940 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
15950 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
15960 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
15970 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
15980 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
15990 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
159a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
159b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
159c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
159d0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
159e0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
159f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
15a10 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
15a20 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
15a30 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
15a40 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
15a50 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
15a60 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
15a70 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
15a80 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
15a90 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
15aa0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
15ab0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
15ac0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
15ad0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
15ae0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
15af0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
15b00 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
15b10 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
15b20 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
15b30 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
15b40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
15b50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
15b60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
15b70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
15b80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
15b90 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
15ba0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
15bb0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
15bc0 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
15bd0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
15be0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
15bf0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
15c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c10 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
15c20 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
15c30 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
15c40 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
15c50 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
15c60 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
15c70 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
15c80 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
15c90 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
15ca0 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
15cb0 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
15cc0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
15cd0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
15ce0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
15cf0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
15d00 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
15d10 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
15d20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
15d30 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
15d40 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
15d50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
15d60 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
15d70 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
15d80 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
15d90 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
15da0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
15db0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
15dc0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
15dd0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
15de0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
15df0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
15e00 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
15e10 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
15e40 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
15e50 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
15e60 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
15e70 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
15e80 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
15e90 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
15ea0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15eb0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
15ec0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
15ed0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ee0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
15ef0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
15f00 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
15f10 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
15f20 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
15f30 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
15f40 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
15f50 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
15f60 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
15f70 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
15f80 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
15f90 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
15fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15fb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
15fc0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
15fd0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
15fe0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
15ff0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
16000 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
16010 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16020 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
16030 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
16040 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
16050 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
16060 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16070 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
16080 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
16090 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
160a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
160b0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
160c0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
160d0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
160e0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
160f0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
16100 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
16110 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
16120 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
16130 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
16140 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
16150 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
16160 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
16170 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
16180 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
16190 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
161a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
161b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161c0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
161d0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
161e0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
161f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
16200 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
16210 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
16220 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16240 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
16250 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
16260 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
16270 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
16280 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
16290 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
162a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
162b0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
162c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
162d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
162e0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
162f0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16300 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16310 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
16320 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
16330 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16350 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
16360 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
16370 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16380 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
16390 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
163a0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
163b0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
163c0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
163d0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
163e0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
163f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
16400 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
16410 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
16420 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
16430 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
16440 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
16450 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
16460 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
16470 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
16480 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16490 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
164a0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
164b0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
164c0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
164d0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
164e0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
164f0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
16500 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
16510 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
16520 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
16530 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16550 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
16560 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
16570 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16580 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
16590 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
165a0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
165b0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
165c0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
165d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
165e0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
165f0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
16600 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
16610 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
16620 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
16630 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
16640 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
16650 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
16660 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
16670 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
16680 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
16690 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
166a0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
166b0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
166c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
166d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
166e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
166f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
16700 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
16710 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16720 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
16730 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16740 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16750 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
16760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16770 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16780 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
16790 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
167a0 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
167b0 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
167c0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
167d0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
167e0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
167f0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
16800 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
16810 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
16820 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
16830 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
16840 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
16850 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
16860 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
16870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16880 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
16890 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
168a0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
168b0 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
168c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
168d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
168e0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
168f0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
16900 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
16910 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
16920 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
16930 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
16940 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
16950 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
16960 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
16970 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
16980 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
16990 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
169a0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
169b0 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
169c0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
169d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
169e0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
169f0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
16a00 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
16a10 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
16a20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
16a30 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16a40 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
16a50 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
16a60 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
16a70 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
16a80 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
16a90 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
16aa0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
16ab0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
16ac0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
16ad0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
16ae0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
16af0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
16b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16b20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16b30 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
16b40 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
16b50 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
16b60 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
16b70 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
16b80 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
16b90 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
16ba0 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
16bb0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
16bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16bd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16be0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
16bf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
16c00 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
16c10 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
16c20 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
16c30 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
16c40 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
16c50 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
16c60 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
16c70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
16c80 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
16c90 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
16ca0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
16cb0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
16cc0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
16cd0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
16ce0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
16cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16d10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16d30 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
16d40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
16d70 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
16d80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16d90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
16da0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
16db0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
16dc0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
16dd0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
16de0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
16df0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
16e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e10 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
16e20 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
16e30 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
16e40 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
16e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16e60 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
16e70 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
16e80 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
16e90 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
16ea0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
16eb0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
16ec0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
16ed0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
16ee0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
16ef0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
16f00 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
16f10 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
16f20 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
16f30 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
16f40 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
16f50 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
16f60 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
16f70 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
16f80 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
16f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16fa0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
16fb0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
16fc0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
16fd0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
16fe0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
16ff0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
17000 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
17010 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
17020 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
17030 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
17040 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
17050 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
17060 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
17070 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
17080 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
17090 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
170a0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
170b0 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
170c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
170d0 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
170e0 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
170f0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
17100 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
17110 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
17120 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
17130 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
17140 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
17150 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
17160 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
17170 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
17180 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
17190 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
171a0 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
171b0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
171c0 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
171d0 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
171e0 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
171f0 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
17200 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
17210 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
17220 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
17230 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
17240 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
17250 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
17260 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
17270 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
17280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17290 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
172a0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
172b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
172c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
172d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
172e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
172f0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
17300 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
17310 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17320 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
17330 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
17340 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
17350 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
17360 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
17370 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
17380 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
17390 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
173a0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
173b0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
173c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
173d0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
173e0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
173f0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
17400 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
17410 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17440 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
17450 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17470 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17480 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
17490 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
174a0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
174b0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
174c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
174d0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
174e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
174f0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
17500 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
17510 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
17520 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
17530 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
17540 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
17550 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
17560 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
17570 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
17580 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
17590 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
175a0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
175b0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
175c0 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
175d0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
175e0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
175f0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
17600 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17610 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17620 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
17630 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
17640 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
17650 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
17660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17670 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17690 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
176a0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
176b0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
176c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
176d0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
176e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
176f0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
17700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17710 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
17720 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
17730 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
17740 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
17750 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
17760 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
17770 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
17780 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
17790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
177a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
177b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
177c0 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
177d0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
177e0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
177f0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
17800 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
17810 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
17820 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
17830 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
17840 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
17850 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
17860 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
17870 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
17880 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
17890 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
178a0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
178b0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
178c0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
178d0 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
178e0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
178f0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
17900 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
17910 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17920 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
17930 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
17940 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
17950 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
17960 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
17970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17990 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
179a0 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
179b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
179c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
179d0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
179e0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
179f0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
17a00 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
17a10 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
17a20 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
17a30 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
17a40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17a50 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
17a60 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
17a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17a80 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
17a90 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
17aa0 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
17ab0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
17ac0 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
17ad0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
17ae0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
17af0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17b00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17b30 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
17b40 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
17b50 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
17b60 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
17b70 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
17b80 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17b90 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
17ba0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
17bb0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
17bd0 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
17be0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17bf0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
17c00 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
17c10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17c30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17c60 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
17c70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
17c80 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
17c90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17cb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17cd0 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
17ce0 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
17cf0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
17d00 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
17d10 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
17d20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
17d30 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
17d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
17d60 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
17d70 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
17d80 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
17d90 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
17da0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
17db0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
17dc0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
17dd0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
17de0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
17df0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
17e00 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
17e10 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
17e20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
17e30 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
17e40 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
17e50 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
17e60 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
17e70 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
17e90 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
17ea0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
17eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17ec0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
17ed0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
17ee0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17ef0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
17f00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17f10 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
17f20 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17f30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
17f40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
17f50 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
17f60 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
17f70 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
17f80 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
17f90 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
17fa0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
17fb0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
17fc0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
17fd0 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50  p(pBt, 0, btreeP
17fe0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
17ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18020 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
18030 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
18040 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
18050 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
18060 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
18070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
18080 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18090 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
180a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
180b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
180c0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
180d0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
180e0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
180f0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
18100 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
18110 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
18120 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
18130 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
18140 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
18150 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
18160 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
18170 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
18180 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
18190 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
181a0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
181b0 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
181c0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
181d0 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
181e0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
181f0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
18200 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
18210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
18220 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
18230 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
18240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18250 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
18260 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
18270 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
18280 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
18290 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
182a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
182b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
182c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
182d0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
182e0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
182f0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
18300 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
18310 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
18320 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
18330 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
18340 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18350 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
18360 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
18370 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
18380 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
18390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
183a0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
183b0 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
183c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  */.    Pgno nPtr
183d0 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  map;      /* Num
183e0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
183f0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
18400 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
18410 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
18420 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
18430 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e   freed */.    in
18440 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
18450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
18460 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
18470 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  map page */.    
18480 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
18490 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
184a0 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
184b0 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
184c0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
184d0 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
184e0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
184f0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
18500 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
18510 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
18520 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
18530 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
18540 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
18550 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
18560 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
18570 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
18580 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
18590 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
185a0 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
185b0 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
185c0 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
185d0 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
185e0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
185f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18600 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18610 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
18620 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
18630 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
18640 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  ]);.    nEntry =
18650 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18660 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  /5;.    nPtrmap 
18670 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
18680 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
18690 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
186a0 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69  /nEntry;.    nFi
186b0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
186c0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
186d0 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
186e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
186f0 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
18700 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18710 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
18720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
18730 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
18740 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
18750 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
18760 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18770 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
18780 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e   }.    if( nFin>
18790 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
187a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
187b0 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72  PT;..    for(iFr
187c0 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
187d0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
187e0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
187f0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
18800 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
18810 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
18820 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
18830 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
18840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
18850 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
18860 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18870 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
18880 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
18890 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
188a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
188b0 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
188c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
188d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
188e0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
188f0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
18900 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
18910 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73 71   nFin);.      sq
18920 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
18930 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
18940 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  ger, nFin);.    
18950 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
18960 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
18970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18980 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18990 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
189a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
189b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
189c0 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
189d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
189e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
189f0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
18a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18a10 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
18a20 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
18a30 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
18a40 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
18a50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
18a60 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
18a70 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
18a80 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
18a90 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
18aa0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
18ab0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
18ac0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
18ad0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
18ae0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
18af0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
18b00 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
18b10 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
18b20 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
18b30 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
18b40 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
18b50 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
18b60 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
18b70 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
18b80 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
18b90 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
18ba0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
18bb0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
18bc0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
18bd0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
18be0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
18bf0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
18c00 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
18c10 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
18c20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
18c30 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
18c40 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
18c50 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
18c60 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18c70 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
18c80 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
18c90 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
18ca0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
18cb0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
18cc0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
18cd0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
18ce0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18cf0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
18d00 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
18d10 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
18d20 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
18d30 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
18d40 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
18d50 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
18d60 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
18d70 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
18d80 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
18d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18da0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
18db0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
18dc0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
18dd0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
18df0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
18e00 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
18e10 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
18e20 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
18e30 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
18e40 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
18e50 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
18e60 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
18e70 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
18e80 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
18e90 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
18ea0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
18eb0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
18ec0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
18ed0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
18ee0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
18ef0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
18f00 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
18f10 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
18f20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
18f30 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
18f40 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
18f50 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
18f60 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
18f70 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
18f80 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
18f90 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
18fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18fb0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
18fc0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
18fd0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
18fe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18ff0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
19000 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19010 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
19020 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19030 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
19040 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
19050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19060 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
19070 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
19080 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
19090 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
190a0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
190b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
190c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
190d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
190e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
190f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19100 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
19110 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
19120 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
19130 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
19140 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
19150 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19160 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
19180 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
19190 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
191a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
191b0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
191c0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
191d0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
191e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
191f0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
19200 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
19210 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
19220 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19230 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
19240 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
19250 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74 72  tex(p) );..  btr
19260 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
19270 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
19280 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
19290 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
192a0 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
192b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
192c0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
192d0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
192e0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
192f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
19300 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
19310 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
19320 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
19330 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
19340 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
19350 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
19360 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
19370 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
19380 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
19390 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
193a0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
193b0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
193c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
193d0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
193e0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
193f0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
19400 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
19410 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19420 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
19430 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
19440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19450 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
19460 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
19470 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
19480 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
19490 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
194a0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
194b0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
194c0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
194d0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
194e0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
194f0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
19500 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
19510 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
19520 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
19530 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
19540 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
19550 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
19560 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19570 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
19580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19590 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
195a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
195b0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
195c0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
195d0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
195e0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
195f0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
19600 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
19610 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
19620 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19630 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
19640 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
19650 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
19660 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
19670 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
19680 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
19690 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
196a0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
196b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
196c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
196d0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
196e0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
196f0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
19700 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19710 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
19720 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
19730 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
19740 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
19750 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
19760 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
19770 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19780 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
19790 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
197a0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
197b0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
197c0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
197d0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
197e0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
197f0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
19800 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
19810 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
19820 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
19830 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
19840 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
19850 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
19860 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
19870 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19880 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
19890 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
198a0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
198b0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
198c0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
198d0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
198e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
198f0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
19900 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
19910 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
19920 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
19930 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
19940 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19950 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
19960 74 72 65 65 20 2a 70 29 7b 0a 0a 20 20 69 66 28  tree *p){..  if(
19970 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19980 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
19990 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
199a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
199b0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
199c0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
199d0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
199e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
199f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
19a00 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
19a10 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
19a20 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
19a30 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
19a40 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
19a50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
19a60 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
19a80 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19a90 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
19aa0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
19ab0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19ac0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
19ad0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
19ae0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
19af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19b00 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
19b10 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
19b20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
19b40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19b50 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
19b60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19b70 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19b80 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
19b90 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
19ba0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
19bb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19bc0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19be0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
19bf0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
19c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19c10 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
19c20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
19c30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19c40 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
19c50 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
19c60 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
19c70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
19c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19ca0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
19cb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19cc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
19ce0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
19cf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19d00 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
19d10 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
19d20 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
19d30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
19d40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
19d50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
19d60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
19d70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
19d80 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
19d90 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
19da0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
19db0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
19dc0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
19dd0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
19de0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
19df0 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
19e00 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
19e10 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
19e20 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
19e30 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
19e40 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
19e50 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
19e60 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
19e70 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
19e80 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
19e90 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
19ea0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
19eb0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
19ec0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
19ed0 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
19ee0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
19ef0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
19f00 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
19f10 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
19f20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
19f30 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
19f40 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
19f50 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
19f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19f70 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
19f80 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
19f90 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
19fa0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
19fb0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
19fc0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
19fd0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
19fe0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
19ff0 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1a000 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1a010 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1a020 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1a030 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1a040 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1a050 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1a060 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1a070 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1a080 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a090 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1a0a0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1a0b0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1a0c0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1a0d0 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1a0e0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1a0f0 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1a100 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1a110 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1a120 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1a130 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1a140 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1a150 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1a160 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1a170 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1a180 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1a190 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1a1a0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1a1b0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1a1c0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1a1d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1a1e0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1a1f0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1a200 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1a210 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
1a220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a230 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1a240 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1a250 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1a260 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1a270 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1a280 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1a290 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1a2a0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1a2b0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1a2c0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1a2d0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1a2e0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1a2f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1a300 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1a310 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1a320 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1a330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a340 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1a350 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1a360 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1a370 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1a380 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1a390 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1a3a0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1a3b0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1a3c0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1a3d0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1a3e0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a3f0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1a400 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1a410 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1a420 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1a430 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1a440 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a450 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1a460 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1a470 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1a480 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1a490 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1a4a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a4b0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1a4c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1a4d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a4e0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1a4f0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1a500 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a510 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
1a520 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1a530 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
1a540 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a550 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
1a560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a570 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
1a580 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
1a590 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
1a5a0 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1a5b0 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
1a5c0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
1a5d0 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
1a5e0 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
1a5f0 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
1a600 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
1a610 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
1a620 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
1a630 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
1a640 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
1a650 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
1a660 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
1a670 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
1a680 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
1a690 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
1a6a0 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
1a6b0 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
1a6c0 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
1a6d0 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
1a6e0 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
1a6f0 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
1a700 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
1a710 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
1a720 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
1a730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1a740 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
1a750 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
1a760 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
1a770 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1a780 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a790 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a7a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1a7b0 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1a7c0 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1a7d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1a7e0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1a7f0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1a800 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1a810 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1a820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1a830 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1a840 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1a850 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1a860 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1a870 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1a880 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1a890 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1a8a0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1a8b0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1a8c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1a8d0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1a8e0 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1a8f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1a900 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
1a910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a920 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
1a930 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
1a940 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1a950 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
1a960 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
1a970 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
1a980 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1a990 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
1a9a0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1a9b0 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
1a9c0 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
1a9d0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1a9e0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
1a9f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1aa00 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1aa10 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
1aa20 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
1aa30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
1aa40 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1aa50 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
1aa60 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1aa70 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
1aa80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1aa90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1aaa0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
1aab0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
1aac0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1aad0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61  ansaction can ca
1aae0 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
1aaf0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
1ab00 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
1ab10 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
1ab20 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
1ab30 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
1ab40 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
1ab50 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1ab60 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1ab70 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
1ab80 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
1ab90 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1aba0 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
1abb0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
1abc0 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
1abd0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
1abe0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
1abf0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
1ac00 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
1ac10 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
1ac20 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
1ac30 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
1ac40 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
1ac50 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
1ac60 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
1ac70 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
1ac80 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
1ac90 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
1aca0 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
1acb0 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
1acc0 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
1acd0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1ace0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
1acf0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1ad00 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1ad10 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
1ad20 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
1ad30 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
1ad40 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1ad50 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
1ad60 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
1ad70 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
1ad80 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
1ad90 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
1ada0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
1adb0 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
1adc0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1add0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
1ade0 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
1adf0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
1ae00 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
1ae10 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
1ae20 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1ae30 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
1ae40 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
1ae50 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
1ae60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1ae70 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
1ae80 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1ae90 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
1aea0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
1aeb0 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
1aec0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1aed0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1aee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1aef0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1af00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1af10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1af20 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f  sert( pBt->readO
1af30 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
1af40 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1af50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1af60 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1af70 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1af80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1af90 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1afa0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1afb0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1afc0 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1afd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1afe0 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1aff0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1b000 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1b010 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1b020 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1b030 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1b040 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1b050 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1b060 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1b070 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1b080 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1b090 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1b0a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1b0b0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1b0c0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1b0d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1b0e0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1b0f0 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1b100 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b110 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1b130 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1b140 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1b150 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1b160 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1b170 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1b180 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1b190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1b1a0 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1b1b0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1b1c0 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1b1d0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1b1e0 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1b1f0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1b200 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1b210 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1b220 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1b230 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1b240 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1b250 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1b260 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1b270 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1b280 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1b290 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1b2a0 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1b2b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1b2c0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1b2d0 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1b2e0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1b2f0 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1b300 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1b310 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1b320 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1b330 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1b340 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1b350 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1b360 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1b370 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1b380 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1b390 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1b3a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b3b0 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1b3c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b3d0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1b3e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b3f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1b400 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1b410 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1b420 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1b430 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1b440 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1b450 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1b460 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1b470 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1b480 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b490 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1b4a0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1b4b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b4c0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1b4d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b4f0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1b500 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c   && pBt->initial
1b510 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e  lyEmpty ) pBt->n
1b520 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1b530 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1b540 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1b550 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1b560 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1b570 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1b580 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1b590 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1b5a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1b5b0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1b5c0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1b5d0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1b5e0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1b5f0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1b600 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1b610 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1b620 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1b630 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1b640 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1b650 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b660 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1b670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b680 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1b690 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1b6a0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1b6b0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1b6c0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1b6d0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1b6e0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1b6f0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1b700 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1b710 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1b720 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1b730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1b740 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1b750 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1b760 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1b770 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1b780 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1b790 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1b7a0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1b7b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1b7c0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1b7d0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1b7e0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1b7f0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1b800 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1b810 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1b820 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1b830 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1b840 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1b850 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1b860 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1b870 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1b880 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1b890 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1b8a0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1b8b0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1b8c0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1b8d0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1b8e0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1b8f0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1b900 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1b910 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1b920 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1b930 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1b940 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1b950 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1b960 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1b970 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1b980 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1b990 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1b9a0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1b9b0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1b9c0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1b9d0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1b9e0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1b9f0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1ba00 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1ba10 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1ba20 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1ba30 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1ba40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1ba50 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1ba60 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1ba70 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1ba80 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1ba90 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1baa0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1bab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1bac0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1bad0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1bae0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1baf0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1bb00 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1bb10 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1bb20 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1bb30 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1bb40 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1bb50 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1bb60 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1bb70 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1bb80 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1bb90 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1bba0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1bbb0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1bbc0 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1bbd0 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1bbe0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1bbf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc00 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1bc10 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1bc40 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1bc50 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc70 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1bc80 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1bc90 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1bcc0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1bcd0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1bce0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1bcf0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1bd00 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1bd10 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1bd20 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1bd30 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1bd60 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1bd70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1bd80 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1bd90 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1bda0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1bdb0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1bdc0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1bdd0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1bde0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1bdf0 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1be00 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1be10 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1be20 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1be30 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1be40 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1be50 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1be60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1be70 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1be80 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1be90 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1bea0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1beb0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1bec0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1bed0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1bee0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1bef0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1bf00 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1bf10 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1bf20 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1bf30 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1bf40 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1bf50 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1bf60 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1bf70 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1bf80 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1bf90 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1bfa0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1bfb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1bfc0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1bfd0 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1bfe0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1bff0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c000 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1c010 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1c020 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1c030 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1c040 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70  EVER(wrFlag && p
1c050 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
1c060 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c070 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1c080 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1c090 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1c0a0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1c0b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c0c0 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EMPTY;.  }..  /*
1c0d0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1c0e0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1c0f0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1c100 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1c110 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1c120 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1c130 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1c140 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1c150 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1c160 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1c170 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1c180 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1c190 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1c1a0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1c1b0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1c1c0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1c1d0 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1c1e0 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1c1f0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1c200 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1c210 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1c220 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1c230 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1c240 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1c250 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1c260 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1c270 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1c280 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1c290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c2a0 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1c2b0 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1c2c0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c2f0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1c300 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1c330 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1c340 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1c350 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1c380 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1c390 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1c3a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1c3b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1c3c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1c3d0 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1c3e0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1c3f0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1c420 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1c430 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c440 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c450 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1c460 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1c470 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1c480 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1c490 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c4a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c4b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1c4c0 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1c4d0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1c4e0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1c4f0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1c500 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1c510 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1c520 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1c530 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1c540 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1c550 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1c560 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1c570 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1c580 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1c590 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1c5a0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1c5b0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1c5c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1c5d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c5e0 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1c5f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
1c600 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
1c610 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
1c620 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1c630 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
1c640 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
1c650 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
1c660 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
1c670 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
1c680 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
1c690 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
1c6a0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
1c6b0 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
1c6c0 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
1c6d0 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
1c6e0 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
1c6f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
1c700 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
1c710 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
1c720 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
1c730 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
1c740 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
1c750 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
1c760 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
1c770 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1c780 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
1c790 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
1c7a0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
1c7b0 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
1c7c0 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
1c7d0 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72  Set the cached r
1c7e0 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76  owid value of ev
1c7f0 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68  ery cursor in th
1c800 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1c810 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20  file.** as pCur 
1c820 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73  and having the s
1c830 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  ame root page nu
1c840 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54  mber as pCur.  T
1c850 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  he value is.** s
1c860 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a  et to iRowid..**
1c870 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76  .** Only positiv
1c880 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61  e rowid values a
1c890 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61  re considered va
1c8a0 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63  lid for this cac
1c8b0 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65  he..** The cache
1c8c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1c8d0 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74  to zero, indicat
1c8e0 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63  ing an invalid c
1c8f0 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65  ache..** A btree
1c900 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20   will work fine 
1c910 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67  with zero or neg
1c920 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57  ative rowids.  W
1c930 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a  e just cannot.**
1c940 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e   cache zero or n
1c950 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20  egative rowids, 
1c960 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c  which means tabl
1c970 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f  es that use zero
1c980 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20   or.** negative 
1c990 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e  rowids might run
1c9a0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
1c9b0 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69  .  But in practi
1c9c0 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e  ce, zero.** or n
1c9d0 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61  egative rowids a
1c9e0 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e  re very uncommon
1c9f0 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20   so this should 
1ca00 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
1ca10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ca20 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
1ca30 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1ca40 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Cur, sqlite3_int
1ca50 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74  64 iRowid){.  Bt
1ca60 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
1ca70 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43  (p=pCur->pBt->pC
1ca80 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1ca90 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1caa0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72  ->pgnoRoot==pCur
1cab0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e  ->pgnoRoot ) p->
1cac0 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52  cachedRowid = iR
1cad0 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  owid;.  }.  asse
1cae0 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64  rt( pCur->cached
1caf0 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b  Rowid==iRowid );
1cb00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cb10 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1cb20 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1cb30 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74  cursor.  A negat
1cb40 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72  ive or zero.** r
1cb50 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1cb60 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72  cates that the r
1cb70 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e  owid cache is in
1cb80 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
1cb90 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   be.** ignored. 
1cba0 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61   If the rowid ca
1cbb0 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  che has never be
1cbc0 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74  fore been set, t
1cbd0 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73  hen a.** zero is
1cbe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71   returned..*/.sq
1cbf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1cc00 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1cc10 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1cc20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1cc30 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1cc40 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  id;.}../*.** Clo
1cc50 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
1cc60 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
1cc70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cc80 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
1cc90 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
1cca0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1ccb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ccc0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
1ccd0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1cce0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
1ccf0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1cd00 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1cd10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
1cd20 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1cd30 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
1cd40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1cd50 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
1cd60 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1cd70 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
1cd80 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
1cd90 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1cda0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
1cdb0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1cdc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
1cdd0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
1cde0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1cdf0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1ce00 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1ce10 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1ce20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
1ce30 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1ce40 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1ce50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1ce60 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1ce70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1ce80 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1ce90 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1cea0 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1ceb0 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
1cec0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1ced0 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
1cee0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1cef0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1cf00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cf10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1cf20 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
1cf30 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
1cf40 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
1cf50 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
1cf60 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
1cf70 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
1cf80 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
1cf90 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
1cfa0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
1cfb0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
1cfc0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
1cfd0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
1cfe0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1cff0 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
1d000 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
1d010 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
1d020 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
1d030 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
1d040 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1d050 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1d060 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1d070 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1d080 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1d090 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1d0a0 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1d0b0 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1d0c0 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1d0d0 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1d0e0 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1d0f0 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1d100 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1d110 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1d120 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1d130 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1d140 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1d150 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1d160 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1d170 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1d180 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1d190 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1d1a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1d1b0 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1d1c0 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1d1d0 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1d1e0 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1d1f0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1d200 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1d210 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1d220 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1d230 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1d240 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1d250 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1d260 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1d270 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
1d280 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1d290 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1d2a0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1d2b0 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1d2c0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1d2d0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1d2e0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1d2f0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1d300 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1d310 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1d320 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1d330 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1d340 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1d350 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1d360 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1d370 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1d380 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1d390 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1d3a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1d3b0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1d3c0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1d3d0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1d3e0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
1d3f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1d400 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1d410 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1d420 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1d430 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
1d440 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
1d450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1d460 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1d470 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
1d480 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
1d490 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
1d4a0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
1d4b0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
1d4c0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
1d4d0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
1d4e0 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
1d4f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
1d540 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1d550 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
1d590 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1d5a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
1d5e0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1d5f0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1d600 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1d610 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1d620 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
1d630 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
1d6d0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
1d720 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
1d730 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
1d740 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
1d750 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
1d760 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1d770 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
1d780 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1d790 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
1d7a0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
1d7b0 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
1d7c0 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
1d7d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1d7e0 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
1d7f0 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
1d800 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
1d810 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
1d820 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
1d830 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1d840 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
1d850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d860 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1d870 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1d880 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
1d890 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
1d8a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
1d8b0 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
1d8c0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
1d8d0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1d8e0 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1d8f0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1d900 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1d910 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1d920 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1d930 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1d940 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1d950 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1d960 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1d970 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1d980 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1d990 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1d9a0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1d9b0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1d9c0 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1d9d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1d9e0 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1d9f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1da00 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
1da10 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
1da20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1da30 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
1da40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1da50 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
1da60 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1da70 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
1da80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1da90 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
1daa0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
1dab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1dac0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1dad0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1dae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1daf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1db00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1db10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1db20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1db30 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
1db40 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
1db50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1db60 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1db70 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
1db80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1db90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1dbb0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1dbc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1dbd0 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1dbe0 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1dbf0 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1dc00 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
1dc10 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1dc20 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
1dc30 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
1dc40 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
1dc50 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
1dc60 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
1dc70 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
1dc80 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
1dc90 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
1dca0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1dcb0 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
1dcc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
1dcd0 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
1dce0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1dcf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
1dd00 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1dd10 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
1dd20 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
1dd30 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
1dd40 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
1dd50 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
1dd60 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
1dd70 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
1dd80 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
1dd90 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
1dda0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ddb0 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1ddc0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1ddd0 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1dde0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ddf0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1de00 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1de10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1de20 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1de30 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
1de40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
1de50 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ta;.  return SQL
1de60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1de70 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1de80 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1de90 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1dea0 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1deb0 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1dec0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1ded0 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1dee0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1def0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1df00 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1df10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1df20 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1df30 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1df40 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1df50 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1df60 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1df70 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1df80 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1df90 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1dfa0 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1dfb0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1dfc0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1dfd0 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1dfe0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1dff0 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1e000 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1e010 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1e020 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1e030 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1e040 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1e050 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1e060 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1e070 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1e080 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1e090 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1e0a0 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1e0b0 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1e0c0 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1e0d0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1e0e0 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1e0f0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1e100 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1e110 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1e120 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1e130 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1e140 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1e150 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1e160 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1e170 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1e180 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1e190 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1e1a0 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1e1b0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1e1c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1e1d0 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1e1e0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1e1f0 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1e200 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1e210 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1e220 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1e230 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1e240 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1e250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e270 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e290 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1e2a0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1e2b0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1e2c0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1e2d0 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1e2e0 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1e2f0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1e300 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1e310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e320 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1e330 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1e340 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1e350 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e360 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1e370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e380 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e390 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e3a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e3b0 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1e3c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e3d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1e3e0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1e3f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e400 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1e410 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1e420 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1e430 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1e440 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1e450 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1e460 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1e470 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1e480 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1e490 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1e4a0 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1e4b0 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1e4c0 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1e4d0 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1e4e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1e4f0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1e500 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1e510 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1e520 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1e530 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1e540 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1e550 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1e560 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1e570 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1e580 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1e590 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1e5a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e5b0 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1e5c0 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1e5d0 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
1e5e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
1e5f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1e600 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1e610 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1e620 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1e630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e640 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1e650 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1e660 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1e670 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1e680 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e690 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1e6a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1e6b0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
1e6c0 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
1e6d0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
1e6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e6f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1e700 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1e710 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
1e720 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1e730 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1e740 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
1e750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e760 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
1e770 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1e780 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1e790 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
1e7a0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
1e7b0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
1e7c0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
1e7d0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
1e7e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
1e7f0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1e800 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
1e810 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
1e820 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
1e830 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
1e840 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
1e850 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
1e860 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
1e870 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
1e880 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
1e890 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
1e8a0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
1e8b0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
1e8c0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
1e8d0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
1e8e0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
1e8f0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
1e900 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
1e910 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
1e920 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
1e930 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
1e940 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e950 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
1e960 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
1e970 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
1e980 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
1e990 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
1e9a0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
1e9b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e9c0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
1e9d0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
1e9e0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1e9f0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
1ea00 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
1ea10 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
1ea20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
1ea30 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
1ea40 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1ea50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1ea60 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
1ea70 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
1ea80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ea90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1eaa0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
1eab0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
1eac0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
1ead0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
1eae0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
1eaf0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
1eb00 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
1eb10 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
1eb20 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
1eb30 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
1eb40 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1eb50 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
1eb60 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
1eb70 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
1eb80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1eb90 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
1eba0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ebb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ebc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ebd0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
1ebe0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
1ebf0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
1ec00 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1ec10 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
1ec20 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
1ec30 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
1ec40 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
1ec50 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
1ec60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1ec80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1ec90 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
1eca0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
1ecb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
1ecc0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1ecd0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
1ece0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1ecf0 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
1ed00 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
1ed10 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
1ed20 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
1ed30 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
1ed40 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
1ed50 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
1ed60 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
1ed70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
1ed80 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
1ed90 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
1eda0 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
1edb0 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
1edc0 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
1edd0 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
1ede0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
1edf0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1ee00 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
1ee10 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
1ee20 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
1ee30 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
1ee40 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
1ee50 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
1ee60 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
1ee70 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
1ee80 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
1ee90 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1eea0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
1eeb0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
1eec0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
1eed0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
1eee0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
1eef0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
1ef00 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
1ef10 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
1ef20 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
1ef30 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
1ef40 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
1ef50 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1ef60 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
1ef70 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
1ef80 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
1ef90 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
1efa0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
1efb0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
1efc0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
1efd0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1efe0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1eff0 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
1f000 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1f010 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
1f020 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
1f030 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
1f040 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
1f050 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
1f060 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
1f070 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
1f080 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
1f090 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
1f0a0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
1f0b0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
1f0c0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1f0d0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
1f0e0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
1f0f0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
1f100 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
1f110 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
1f120 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
1f130 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
1f140 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
1f150 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f160 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1f170 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
1f180 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1f190 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1f1a0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1f1b0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1f1c0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
1f1d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
1f1e0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
1f1f0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
1f200 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
1f210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f220 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
1f230 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
1f240 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
1f250 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
1f260 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
1f270 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f290 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
1f2a0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
1f2b0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1f2c0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1f2d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f2e0 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
1f2f0 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
1f300 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f310 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f320 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f330 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
1f340 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1f350 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1f360 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
1f390 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1f3a0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1f3b0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1f3c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f3d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f3e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f3f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1f400 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1f410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1f420 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f430 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
1f440 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f450 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f460 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1f470 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1f480 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1f490 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1f4a0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1f4b0 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45  nKey);..  if( NE
1f4c0 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e  VER(offset+amt >
1f4d0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
1f4e0 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26  .nData) .   || &
1f4f0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1f500 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
1f510 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
1f520 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29  >usableSize].  )
1f530 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
1f540 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
1f550 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
1f560 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
1f570 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
1f580 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f590 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1f5a0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
1f5b0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
1f5c0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
1f5d0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
1f5e0 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
1f5f0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
1f600 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
1f610 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
1f620 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
1f630 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1f640 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
1f650 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
1f660 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
1f670 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1f680 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1f690 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
1f6a0 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
1f6b0 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
1f6c0 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
1f6d0 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
1f6e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
1f6f0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
1f700 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
1f710 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f720 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1f730 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
1f740 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
1f750 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
1f760 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
1f770 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
1f780 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
1f790 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
1f7a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
1f7b0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1f7c0 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66  o.nLocal]);..#if
1f7d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f7e0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a  _INCRBLOB.    /*
1f7f0 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c   If the isIncrbl
1f800 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1f810 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43   set and the BtC
1f820 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
1f830 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ].    ** has not
1f840 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1f850 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
1f860 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73  . The array is s
1f870 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f  ized at.    ** o
1f880 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
1f890 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
1f8a0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1f8b0 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a  chain. The.    *
1f8c0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1f8d0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
1f8e0 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72  low page is stor
1f8f0 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
1f900 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20  0],.    ** etc. 
1f910 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
1f920 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
1f930 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74  array means "not
1f940 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20   yet known".    
1f950 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73  ** (the cache is
1f960 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
1f970 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1f980 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
1f990 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43  lobHandle && !pC
1f9a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1f9b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
1f9c0 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
1f9d0 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
1f9e0 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
1f9f0 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
1fa00 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
1fa10 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29  rflow = (Pgno *)
1fa20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1fa30 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e  o(sizeof(Pgno)*n
1fa40 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Ovfl);.      /* 
1fa50 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20  nOvfl is always 
1fa60 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69 74  positive.  If it
1fa70 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63   were zero, fetc
1fa80 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68  hPayload would h
1fa90 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65  ave.      ** bee
1faa0 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  n used instead o
1fab0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  f this routine. 
1fac0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
1fad0 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70  AYS(nOvfl) && !p
1fae0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1faf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1fb00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1fb10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1fb20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
1fb30 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1fb40 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
1fb50 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
1fb60 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
1fb70 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
1fb80 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
1fb90 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
1fba0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
1fbb0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
1fbc0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1fbd0 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
1fbe0 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
1fbf0 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
1fc00 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
1fc10 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
1fc20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
1fc30 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1fc40 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
1fc50 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
1fc60 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
1fc70 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
1fc80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fc90 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
1fca0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
1fcb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fcc0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
1fcd0 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
1fce0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
1fcf0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1fd00 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
1fd10 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1fd20 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
1fd30 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
1fd40 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
1fd50 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1fd60 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
1fd70 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
1fd80 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1fd90 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
1fda0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1fdb0 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
1fdc0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
1fdd0 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
1fde0 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
1fdf0 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
1fe00 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
1fe10 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
1fe20 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
1fe30 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1fe40 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
1fe50 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
1fe60 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1fe70 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
1fe80 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
1fe90 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
1fea0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1feb0 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
1fec0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
1fed0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1fee0 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
1fef0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
1ff00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ff10 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1ff20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
1ff30 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
1ff40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1ff50 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
1ff60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
1ff70 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1ff80 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
1ff90 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
1ffa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1ffb0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
1ffc0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
1ffd0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1ffe0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
1fff0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
20000 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
20010 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
20020 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
20030 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
20040 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
20050 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
20060 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
20070 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
20080 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
20090 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
200a0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
200b0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
200c0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
200d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
200e0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
200f0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
20100 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20130 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
20140 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
20150 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20160 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
20170 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
20180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20190 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
201a0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
201b0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
201c0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
201d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
201e0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
201f0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
20200 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
20210 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
20220 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20230 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
20240 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
20250 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
20260 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
20270 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
20280 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += a;.        }.
20290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
202a0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
202b0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
202c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
202d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
202e0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
202f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
20300 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
20310 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
20320 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
20330 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
20340 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
20350 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
20360 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
20370 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
20380 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
20390 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
203a0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
203b0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
203c0 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
203d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
203e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
203f0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
20400 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20410 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
20420 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
20430 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
20440 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
20450 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
20460 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
20470 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
20480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
20490 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
204a0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
204b0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
204c0 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
204d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
204e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
204f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20500 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20510 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20520 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
20530 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20540 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
20550 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
20560 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
20570 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20580 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
20590 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
205a0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
205b0 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
205c0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
205d0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
205e0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
205f0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
20600 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
20610 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
20620 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
20630 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
20640 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
20650 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
20660 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
20670 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20680 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
20690 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
206a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
206b0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
206c0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
206d0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
206e0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
206f0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
20700 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
20710 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
20720 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
20730 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
20740 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
20750 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
20760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20770 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
20780 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
20790 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
207a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
207b0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
207c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
207d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
207e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
207f0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
20800 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
20810 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
20830 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20840 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
20860 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
20870 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20880 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
20890 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
208a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
208b0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
208c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
208d0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
208e0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
208f0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
20900 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
20910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20920 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20930 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
20940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
20950 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
20960 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
20970 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
20980 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
20990 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
209a0 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
209b0 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
209c0 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
209d0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
209e0 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
209f0 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
20a00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
20a10 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
20a20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
20a30 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
20a40 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
20a50 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
20a60 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
20a70 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
20a80 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
20a90 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
20aa0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
20ab0 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
20ac0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
20ad0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
20ae0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
20af0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
20b00 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
20b10 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
20b20 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
20b30 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
20b40 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
20b50 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
20b60 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
20b70 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
20b80 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
20b90 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
20ba0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
20bb0 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
20bc0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
20bd0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
20be0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
20bf0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
20c00 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
20c10 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
20c20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
20c30 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
20c40 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
20c50 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
20c60 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
20c70 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
20c80 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
20c90 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
20ca0 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
20cb0 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
20cc0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
20cd0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
20ce0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
20cf0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
20d00 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
20d10 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
20d20 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
20d30 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
20d40 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
20d50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
20d60 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
20d70 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
20d80 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
20d90 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
20da0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
20db0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
20dc0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
20dd0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
20de0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
20df0 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
20e00 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  u32 nLocal;..
20e10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
20e20 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
20e30 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
20e40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20e60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20e70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
20e80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20e90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20ea0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
20eb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20ec0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e];.  assert( pC
20ed0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20ee0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
20ef0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ell );.  if( NEV
20f00 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  ER(pCur->info.nS
20f10 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62  ize==0) ){.    b
20f20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
20f30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20f40 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  >iPage], pCur->a
20f50 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20f60 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
20f70 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66        &pCur->inf
20f80 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f  o);.  }.  aPaylo
20f90 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
20fa0 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61  pCell;.  aPayloa
20fb0 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  d += pCur->info.
20fc0 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
20fd0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
20fe0 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
20ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
21000 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
21010 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
21020 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
21030 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
21040 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
21050 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21060 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
21070 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
21080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21090 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  l;.    assert( n
210a0 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20  Local<=nKey );. 
210b0 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
210c0 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
210d0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
210e0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
210f0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
21100 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
21110 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
21120 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
21130 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
21140 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
21150 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
21160 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
21170 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
21180 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
21190 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
211a0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
211b0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
211c0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
211d0 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
211e0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
211f0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
21200 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
21210 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
21220 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
21230 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
21240 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
21250 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
21260 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
21270 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
21280 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
21290 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
212a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
212b0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
212c0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
212d0 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
212e0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
212f0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
21300 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
21310 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
21320 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
21330 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
21340 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21350 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f  int *pAmt){.  co
21360 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  nst void *p = 0;
21370 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21380 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
21390 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
213a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
213b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
213c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
213d0 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
213e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
213f0 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20  VALID) ){.    p 
21400 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  = (const void*)f
21410 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
21420 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
21430 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f    return p;.}.co
21440 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
21450 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
21460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21470 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f  int *pAmt){.  co
21480 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  nst void *p = 0;
21490 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
214a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
214b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
214c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
214d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
214e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
214f0 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
21500 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21510 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20  VALID) ){.    p 
21520 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  = (const void*)f
21530 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
21540 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
21550 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a    return p;.}...
21560 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
21570 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
21580 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
21590 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
215a0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
215b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
215c0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
215d0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
215e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
215f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
21600 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
21610 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
21620 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
21630 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
21640 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
21650 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
21660 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
21670 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
21680 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
21690 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
216a0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
216b0 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
216c0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
216d0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
216e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
216f0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
21700 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
21710 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
21720 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
21730 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
21740 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
21750 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21760 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21770 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21780 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21790 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
217a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
217b0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
217c0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
217d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
217e0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
217f0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
21800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21810 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
21820 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
21830 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
21840 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
21850 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
21860 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
21870 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
21880 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
21890 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
218a0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
218b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
218c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
218d0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
218e0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
218f0 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
21900 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
21910 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
21920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21930 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21940 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
21950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
21960 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
21970 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
21980 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
21990 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
219a0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
219b0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
219c0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
219d0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
219e0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
219f0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
21a00 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
21a10 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
21a20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
21a30 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
21a40 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
21a50 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
21a60 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
21a70 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
21a80 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
21a90 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
21aa0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
21ab0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
21ac0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
21ad0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
21ae0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
21af0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
21b00 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
21b10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
21b20 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
21b30 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
21b40 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
21b50 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
21b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
21b70 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
21b80 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
21b90 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
21ba0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
21bb0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
21bc0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
21bd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
21be0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
21bf0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
21c00 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
21c10 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
21c20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
21c30 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
21c40 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
21c50 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
21c60 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
21c70 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
21c80 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
21c90 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
21ca0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
21cb0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
21cc0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
21cd0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
21ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21cf0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
21d00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
21d10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21d20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21d40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21d50 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21d60 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
21d70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
21d80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21d90 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
21da0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
21db0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
21dc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
21dd0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
21de0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
21df0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
21e00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21e10 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
21e20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21e30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21e40 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
21e50 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
21e60 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
21e70 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
21e80 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
21e90 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21ea0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
21eb0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
21ec0 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
21ed0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
21ee0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
21ef0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
21f00 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
21f10 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
21f20 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
21f30 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
21f40 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
21f50 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
21f60 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
21f70 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
21f80 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
21f90 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
21fa0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
21fb0 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
21fc0 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
21fd0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
21fe0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
21ff0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
22000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
22010 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
22020 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
22030 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
22040 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
22050 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
22060 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
22070 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
22080 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
22090 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
220a0 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
220b0 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
220c0 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
220d0 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
220e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
220f0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
22100 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
22110 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
22120 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
22130 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
22140 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
22150 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
22160 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
22170 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
22180 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
22190 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
221a0 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
221b0 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
221c0 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
221d0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
221e0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
221f0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
22200 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
22210 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
22220 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
22230 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
22240 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
22250 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
22260 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
22270 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
22280 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
22290 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
222a0 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
222b0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
222c0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
222d0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
222e0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
222f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22300 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
22310 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
22320 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22330 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
22340 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22350 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22360 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
22370 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
22380 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
22390 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
223a0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
223b0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
223c0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
223d0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
223e0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
223f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
22400 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
22410 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
22420 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22430 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
22440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22450 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
22460 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
22470 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
22480 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
22490 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
224a0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
224b0 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
224c0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
224d0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
224e0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
224f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
22500 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
22510 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
22520 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
22530 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
22540 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
22550 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
22560 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
22570 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
22580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
225a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
225b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
225c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
225d0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
225e0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Page = 0;..    /
225f0 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
22600 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
22610 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
22620 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
22630 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20  s cursor.    ** 
22640 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
22650 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
22660 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
22670 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
22680 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74  s.    ** NULL, t
22690 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
226a0 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
226b0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
226c0 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a   the case,.    *
226d0 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
226e0 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
226f0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
22700 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
22710 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  ]->intKey==1 || 
22720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
22730 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
22740 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65    if( (pCur->pKe
22750 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d  yInfo==0)!=pCur-
22760 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
22770 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
22780 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22790 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
227a0 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  }..  /* Assert t
227b0 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  hat the root pag
227c0 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  e is of the corr
227d0 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d  ect type. This m
227e0 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20  ust be the.  ** 
227f0 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c  case as the call
22800 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22810 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68  n that loaded th
22820 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74  e root-page (eit
22830 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  her.  ** this ca
22840 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73  ll or a previous
22850 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75   invocation) wou
22860 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
22870 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a   corruption .  *
22880 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74  * if the assumpt
22890 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
228a0 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  e, and it is not
228b0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
228c0 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79  e flags .  ** by
228d0 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  te to have been 
228e0 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74  modified while t
228f0 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f  his cursor is ho
22900 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
22910 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  e.  ** to the pa
22920 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20  ge.  */.  pRoot 
22930 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
22940 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
22950 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
22960 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73  pgnoRoot );.  as
22970 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49  sert( pRoot->isI
22980 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b  nit && (pCur->pK
22990 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f  eyInfo==0)==pRoo
229a0 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20  t->intKey );..  
229b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
229c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
229d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
229e0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
229f0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
22a00 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52  y = 0;..  if( pR
22a10 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
22a20 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
22a30 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
22a40 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
22a50 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
22a60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22a70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
22a80 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
22a90 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
22aa0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
22ab0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
22ac0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
22ad0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
22ae0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
22af0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
22b00 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
22b10 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
22b20 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
22b30 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
22b40 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
22b50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
22b60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
22b70 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
22b80 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
22b90 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
22ba0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
22bb0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
22bc0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
22bd0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
22be0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
22bf0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
22c00 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
22c10 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
22c20 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
22c30 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
22c40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
22c50 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
22c60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22c70 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
22c80 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
22c90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22ca0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22cb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22cc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22cd0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
22ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
22cf0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
22d00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22d10 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
22d20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22d30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22d40 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
22d50 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
22d60 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
22d70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
22d80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
22d90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
22da0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
22db0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
22dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
22dd0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
22de0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
22df0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
22e00 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
22e10 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
22e20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
22e30 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
22e40 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
22e50 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
22e60 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
22e70 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
22e80 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
22e90 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
22ea0 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
22eb0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
22ec0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
22ed0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
22ee0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
22ef0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
22f00 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
22f10 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
22f20 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
22f30 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
22f40 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
22f50 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
22f60 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
22f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
22f80 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
22f90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22fa0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
22fb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22fc0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
22fd0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
22fe0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22ff0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23000 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23010 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23020 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
23030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23040 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
23050 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23060 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
23070 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
23080 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
23090 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
230a0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
230b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
230c0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
230d0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
230e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
230f0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
23100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23110 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
23120 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
23130 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
23140 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
23150 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
23160 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
23170 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23180 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
23190 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
231a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
231b0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
231c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
231d0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
231e0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
231f0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
23200 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
23210 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
23220 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
23230 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
23240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23250 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
23260 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23270 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23280 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
23290 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
232a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
232b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
232c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
232d0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
232e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
232f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
23300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23310 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
23320 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
23330 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
23340 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23350 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23360 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
23370 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
23380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
23390 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
233a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
233b0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
233c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
233d0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
233e0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
233f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23400 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
23410 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
23420 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
23430 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
23440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
23450 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
23460 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
23470 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
23480 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
23490 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
234a0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
234b0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
234c0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
234d0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
234e0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
234f0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23500 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
23510 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23520 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23540 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
23550 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
23560 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
23570 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
23580 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
23590 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
235a0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
235b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
235c0 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
235d0 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
235e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
235f0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
23600 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
23610 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
23620 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
23630 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
23640 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
23650 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
23660 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
23670 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
23680 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
23690 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
236a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
236b0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
236c0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
236d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
236e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
236f0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
23700 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23710 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
23720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
23730 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23740 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
23750 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
23760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23770 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
23780 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
23790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
237a0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
237b0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
237c0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
237d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
237e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
237f0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
23800 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23820 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23830 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23840 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
23850 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
23860 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
23870 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
23880 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
23890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
238a0 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
238b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
238c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
238d0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
238e0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
238f0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
23900 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
23910 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
23920 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
23930 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
23940 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
23950 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
23960 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
23970 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
23980 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
23990 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
239a0 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
239b0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
239c0 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
239d0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
239e0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
239f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
23a00 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
23a10 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
23a20 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
23a30 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
23a40 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
23a50 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
23a60 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
23a70 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
23a80 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
23a90 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
23aa0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
23ab0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
23ac0 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
23ad0 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
23ae0 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
23af0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
23b00 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
23b10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
23b20 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
23b30 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
23b40 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
23b50 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
23b60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
23b70 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
23b80 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
23b90 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
23ba0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
23bb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23bc0 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
23bd0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
23be0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
23bf0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
23c20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
23c30 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
23c40 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
23c50 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
23c60 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
23c70 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
23c80 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
23c90 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
23ca0 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
23cb0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
23cc0 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
23cd0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
23ce0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
23cf0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
23d00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23d10 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
23d20 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
23d30 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
23d40 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
23d50 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
23d60 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
23d70 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
23d80 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
23d90 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23da0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
23db0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
23dc0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
23dd0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
23de0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
23df0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
23e00 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
23e10 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
23e20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
23e30 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
23e40 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
23e50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
23e60 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
23e70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
23e80 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
23e90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23ea0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23eb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23ec0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
23ed0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
23ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
23ef0 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
23f00 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
23f10 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
23f20 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
23f30 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
23f40 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
23f50 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
23f60 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
23f70 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
23f80 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
23f90 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
23fa0 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
23fb0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23fc0 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e  _VALID && pCur->
23fd0 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26  validNKey .   &&
23fe0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23ff0 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
24000 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
24010 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
24020 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
24030 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
24040 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24050 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
24060 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69  tLast && pCur->i
24070 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
24080 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
24090 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
240a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
240b0 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d   }.  }..  rc = m
240c0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
240d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
240e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
240f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24100 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24110 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
24120 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24130 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
24140 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
24150 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24160 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
24170 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  >0 || pCur->eSta
24180 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
24190 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ID );.  if( pCur
241a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
241b0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
241c0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
241d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
241e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
241f0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
24200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24210 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
24220 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24230 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
24240 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
24250 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
24260 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
24270 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
24280 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
24290 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
242a0 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63  Page];.    int c
242b0 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  ;..    /* pPage-
242c0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
242d0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
242e0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
242f0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
24300 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
24310 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
24320 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
24330 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
24340 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
24350 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
24360 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
24370 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
24380 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
24390 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
243a0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
243b0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
243c0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
243d0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
243e0 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
243f0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
24400 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
24410 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
24420 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
24430 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
24440 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
24450 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
24460 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
24470 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
24480 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
24490 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
244a0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
244b0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
244c0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
244d0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
244e0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
244f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
24500 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24510 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65  (u16)upr;.    }e
24520 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
24530 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24540 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72  ge] = (u16)((upr
24550 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
24560 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
24570 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
24580 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24590 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20  Page]; /* Index 
245a0 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  of current cell 
245b0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20  in pPage */.    
245c0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
245f0 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
24600 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
24610 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
24620 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
24630 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
24640 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
24650 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
24660 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
24670 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
24680 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
24690 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
246a0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
246b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
246c0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
246d0 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
246e0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
246f0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
24700 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
24710 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
24720 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
24730 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
24740 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
24750 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
24760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
24770 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
24780 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
24790 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
247a0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
247b0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
247c0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
247d0 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
247e0 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d   }.        pCur-
247f0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
24800 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
24810 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
24820 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
24830 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
24840 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
24850 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
24860 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
24870 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
24880 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
24890 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
248a0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
248b0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
248c0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
248d0 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
248e0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
248f0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
24900 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
24910 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
24920 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
24930 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
24940 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
24950 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
24960 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
24970 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
24980 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
24990 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
249a0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
249b0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
249c0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
249d0 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
249e0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
249f0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
24a00 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
24a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24a20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
24a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28  ;.        if( !(
24a40 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26  nCell & 0x80) &&
24a50 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
24a60 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
24a70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
24a80 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
24a90 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
24aa0 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
24ab0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
24ac0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
24ad0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
24ae0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
24af0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
24b00 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
24b10 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
24b20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
24b30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24b40 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
24b50 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
24b60 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
24b70 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
24b80 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
24b90 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
24ba0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
24bb0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
24bc0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
24bd0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
24be0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
24bf0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
24c00 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
24c10 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
24c20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
24c30 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
24c40 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
24c50 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
24c60 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
24c70 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
24c80 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
24c90 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
24ca0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24cb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
24cc0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
24cd0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
24ce0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
24cf0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
24d00 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
24d10 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
24d20 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
24d30 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
24d40 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
24d50 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
24d60 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
24d70 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
24d80 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
24d90 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
24da0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
24db0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
24dc0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
24dd0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
24de0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
24df0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
24e00 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
24e10 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
24e20 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
24e30 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
24e40 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
24e50 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
24e60 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
24e70 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
24e80 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
24e90 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
24ea0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
24eb0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
24ec0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
24ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
24ee0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
24ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
24f00 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
24f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24f20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
24f30 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
24f40 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
24f50 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
24f60 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
24f70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24f90 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
24fb0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
24fc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24fd0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24fe0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24ff0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
25000 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
25010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25020 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
25030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25040 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
25050 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25060 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
25070 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
25080 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
25090 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
250a0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
250b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
250c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
250d0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
250e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
250f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
25110 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
25120 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25130 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
25140 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
25150 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
25160 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
25170 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
25180 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
25190 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
251a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
251b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
251c0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
251d0 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20  ((lwr+upr)/2);. 
251e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
251f0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
25200 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25210 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
25220 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
25230 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
25240 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
25250 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
25260 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
25270 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
25280 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
25290 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
252a0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
252b0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
252c0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
252d0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
252e0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
252f0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
25300 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25310 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
25320 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25330 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25340 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25350 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
25360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
25370 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
25380 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
25390 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
253a0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
253b0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
253c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
253d0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
253e0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
253f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25400 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
25410 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
25420 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
25430 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
25440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
25450 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
25460 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
25470 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
25480 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
25490 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
254a0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
254b0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
254c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
254d0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
254e0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
254f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
25500 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
25510 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
25520 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
25530 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
25540 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
25550 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
25560 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
25570 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
25580 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25590 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
255a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
255b0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
255c0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
255d0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
255e0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
255f0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
25600 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
25610 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
25620 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
25630 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
25640 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
25650 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
25660 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
25670 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
25680 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
25690 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
256a0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
256b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
256c0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
256d0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
256e0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
256f0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
25700 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
25710 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
25720 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
25730 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
25740 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
25750 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
25760 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25770 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
25780 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
25790 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
257a0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
257b0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
257c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
257d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
257e0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
257f0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
25800 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
25810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
25820 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
25830 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
25840 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
25850 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
25860 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
25870 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
25880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25890 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
258a0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70  pNext>0 ){.    p
258b0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
258c0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
258d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
258e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
258f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
25900 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
25910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25920 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
25930 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
25940 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
25950 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
25960 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
25970 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65   idx<=pPage->nCe
25980 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
25990 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
259a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
259b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
259c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
259d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
259e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
259f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25a00 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
25a10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
25a20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
25a30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
25a40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25a50 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
25a60 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
25a70 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
25a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25a90 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
25aa0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
25ab0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
25ac0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
25ad0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
25ae0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
25af0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
25b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
25b20 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
25b30 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
25b40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25b50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
25b60 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
25b70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
25b80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
25b90 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
25ba0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
25bb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  tKey ){.      rc
25bc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
25bd0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
25be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25bf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
25c10 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
25c20 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
25c30 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
25c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25c50 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
25c60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
25c70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
25c80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
25c90 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
25ca0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
25cb0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
25cc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
25cd0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
25ce0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
25cf0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
25d00 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
25d10 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
25d20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
25d30 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
25d40 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
25d50 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
25d60 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
25d70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25d80 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
25d90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
25da0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
25db0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
25dc0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
25dd0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25de0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
25df0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
25e00 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
25e10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25e20 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
25e30 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
25e40 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
25e50 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
25e60 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
25e70 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
25e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25e90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
25ea0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
25eb0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
25ec0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
25ed0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25ef0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
25f00 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
25f10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
25f20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25f40 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
25f50 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
25f60 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
25f70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25f80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
25f90 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25fa0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
25fb0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
25fc0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
25fd0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
25fe0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25ff0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
26000 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
26010 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
26020 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26030 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
26040 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
26050 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
26060 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
26070 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
26080 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
26090 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
260a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
260b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
260c0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
260d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
260e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
260f0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
26100 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70  NKey = 0;..    p
26110 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26120 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
26130 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26140 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26150 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
26160 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
26170 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
26180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
26190 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
261a0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
261b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
261c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
261d0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
261e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
261f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
26200 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
26210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26220 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
26230 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
26240 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
26250 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
26260 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
26270 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
26280 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
26290 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
262a0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
262b0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
262c0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
262d0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
262e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
262f0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
26300 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
26310 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
26320 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
26330 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
26340 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
26350 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
26360 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
26370 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
26380 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
26390 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
263a0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
263b0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
263c0 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
263d0 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
263e0 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
263f0 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
26400 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
26410 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
26420 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
26430 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
26440 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
26450 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
26460 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
26470 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
26480 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
26490 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
264a0 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
264b0 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
264c0 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
264d0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
264e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
264f0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
26500 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
26510 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
26520 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
26530 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
26540 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
26550 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
26560 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
26570 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
26580 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
26590 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
265a0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
265b0 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
265c0 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
265d0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
265e0 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
265f0 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
26600 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
26610 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
26620 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
26630 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
26640 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
26650 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
26660 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
26670 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
26680 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
26690 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
266a0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
266b0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
266c0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
266d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
266e0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
266f0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
26700 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
26710 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
26720 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
26730 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
26740 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
26750 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
26760 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
26770 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26780 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
26790 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
267a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
267b0 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
267c0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
267d0 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
267e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
267f0 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
26800 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
26810 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
26820 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
26830 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26840 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
26850 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
26860 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
26870 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
26880 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
26890 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
268a0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
268b0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
268c0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
268d0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
268e0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
268f0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
26900 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
26910 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
26920 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
26930 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
26940 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
26950 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
26960 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
26970 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
26980 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
26990 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
269a0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
269b0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
269c0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
269d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
269e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
269f0 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
26a00 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
26a10 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
26a20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
26a30 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
26a40 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
26a50 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
26a60 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
26a70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
26a80 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
26a90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
26ab0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
26ac0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
26ad0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
26ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
26af0 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
26b00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
26b10 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
26b20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
26b30 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
26b40 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
26b50 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
26b60 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
26b70 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
26b80 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
26b90 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
26ba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26bb0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
26bc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
26bd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26be0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
26bf0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
26c00 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
26c10 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
26c20 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
26c30 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
26c40 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
26c50 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
26c60 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
26c70 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
26c80 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
26c90 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
26ca0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
26cb0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
26cc0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
26cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
26ce0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
26cf0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
26d00 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
26d10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
26d20 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
26d30 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
26d40 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
26d50 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
26d60 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
26d70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
26d80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26d90 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
26da0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
26db0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
26dc0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
26dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
26de0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
26df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
26e00 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
26e10 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
26e20 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
26e30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
26e40 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
26e50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
26e60 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26e70 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
26e80 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
26e90 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
26ea0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
26eb0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
26ec0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
26ed0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
26ee0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
26ef0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
26f00 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
26f10 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
26f20 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
26f30 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
26f40 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
26f50 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
26f60 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
26f70 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26f80 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
26f90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
26fa0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26fb0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
26fc0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
26fd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26fe0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26ff0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27000 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
27010 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
27020 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
27030 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
27040 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27050 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
27060 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
27070 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
27080 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
27090 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
270a0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
270b0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
270c0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
270d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
270e0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
270f0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
27100 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
27110 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
27120 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
27130 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
27140 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27150 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27160 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
27170 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27190 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
271a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
271b0 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
271c0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
271d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
271e0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
271f0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
27200 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
27210 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27220 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
27230 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
27240 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
27250 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
27260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
27270 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
27280 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
27290 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
272a0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
272b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
272c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
272d0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
272e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
272f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27300 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27310 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27320 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
27330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
27340 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
27350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
27360 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
27370 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
27380 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
27390 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
273a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
273b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
273c0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
273d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
273e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
273f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27400 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27410 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27430 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
27440 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
27450 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
27460 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
27470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27490 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
274a0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
274b0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
274c0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
274d0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
274e0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
274f0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
27500 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
27510 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
27520 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
27530 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
27540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27550 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
27560 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
27570 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
27580 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
27590 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
275a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
275b0 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
275c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
275d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
275e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
275f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27600 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27620 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
27630 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
27640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27650 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27660 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
27670 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
27680 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
276a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
276b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
276c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
276d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
276e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
276f0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
27700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27720 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
27730 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
27740 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
27750 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27760 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
27780 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
27790 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
277a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
277b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
277c0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
277d0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
277e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
277f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
27800 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
27810 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
27820 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
27830 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
27840 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
27850 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
27860 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
27870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27880 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27890 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
278a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
278b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
278c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
278d0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
278e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
278f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27900 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27910 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
27920 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27930 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27940 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27950 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27970 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
27980 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
27990 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
279a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
279b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
279c0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
279d0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
279e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
279f0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
27a00 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
27a10 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
27a20 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
27a30 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
27a40 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
27a50 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
27a60 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
27a70 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
27a80 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
27a90 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
27aa0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
27ab0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
27ac0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ad0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
27ae0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
27af0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27b00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
27b10 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27b30 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
27b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
27b50 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
27b60 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
27b70 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
27b80 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
27b90 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
27ba0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
27bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
27bc0 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
27bd0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
27be0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
27bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
27c00 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
27c10 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
27c20 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
27c30 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
27c40 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
27c50 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
27c60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
27c70 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
27c90 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
27ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27cb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
27cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
27cd0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
27ce0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
27cf0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
27d00 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
27d10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
27d20 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
27d30 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
27d40 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
27d50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27d60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27d70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
27d80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
27d90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27da0 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
27db0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
27dc0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
27dd0 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
27de0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
27df0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
27e00 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
27e10 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
27e20 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
27e30 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
27e40 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
27e50 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
27e60 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
27e70 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
27e80 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
27ea0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
27eb0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
27ec0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
27ed0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
27ee0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
27ef0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
27f00 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
27f10 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
27f20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27f30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
27f40 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
27f50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27f60 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
27f70 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
27f80 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
27f90 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
27fa0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
27fb0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
27fc0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
27fd0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27fe0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
27ff0 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
28000 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
28010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
28030 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28040 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
28050 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28060 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28080 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
28090 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
280a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
280b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
280c0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
280d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
280e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
280f0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
28100 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
28110 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
28120 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
28130 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
28140 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
28150 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
28160 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
28170 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
28180 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
28190 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
281a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
281b0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
281c0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
281d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
281e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
281f0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
28200 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
28210 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
28220 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
28230 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
28240 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
28250 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
28260 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
28270 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
28280 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
28290 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
282a0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
282b0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
282c0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
282d0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
282e0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
282f0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
28300 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
28310 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
28320 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
28330 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
28340 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
28350 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
28360 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
28370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
28380 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
28390 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
283a0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
283b0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
283c0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
283d0 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
283e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
283f0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
28400 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28410 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
28420 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28430 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
28440 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 1);.      if
28450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28460 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28470 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28480 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
28490 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
284a0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
284b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
284c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
284d0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
284e0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
284f0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
28500 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
28510 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
28520 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28530 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
28540 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
28550 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
28560 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
28570 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
28580 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
28590 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
285a0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
285b0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
285c0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
285d0 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20   ppPage, 1);.   
285e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
285f0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
28600 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28610 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
28620 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
28630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28640 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28650 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
28660 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28670 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
28680 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
28690 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
286a0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
286b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
286c0 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
286d0 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
286e0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
286f0 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
28700 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
28710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28720 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
28730 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
28740 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
28750 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
28760 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28770 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
28780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28790 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
287a0 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
287b0 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
287c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
287d0 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
287e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
287f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
28800 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
28810 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
28820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28830 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
28840 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
28850 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
28860 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
28870 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
28880 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
28890 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
288a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
288b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
288c0 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
288d0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
288e0 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
288f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28900 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
28910 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
28920 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
28930 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
28940 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
28950 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
28960 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
28970 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
28980 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
28990 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
289a0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
289b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
289c0 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
289d0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
289e0 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
289f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
28a00 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
28a10 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
28a20 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
28a30 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
28a40 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
28a50 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
28a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
28a70 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
28a80 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
28a90 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
28aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28ab0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
28ac0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
28ad0 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
28ae0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
28af0 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
28b00 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
28b10 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
28b20 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
28b50 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
28b60 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b90 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
28ba0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
28bd0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
28be0 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
28bf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28c00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
28c10 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
28c20 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
28c30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
28c40 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
28c50 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
28c60 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
28c70 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
28c80 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
28c90 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
28ca0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
28cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
28cc0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
28cd0 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
28ce0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
28cf0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
28d00 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
28d10 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
28d20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28d30 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
28d40 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
28d50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28d60 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
28d70 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
28d80 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
28d90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
28da0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
28db0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63  ..  if( pBt->sec
28dc0 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
28dd0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
28de0 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
28df0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
28e00 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
28e10 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
28e20 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
28e30 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
28e40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
28e50 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
28e60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28e70 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
28e80 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
28e90 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
28ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28eb0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
28ec0 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
28ed0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
28ee0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
28ef0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
28f00 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
28f10 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
28f20 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
28f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
28f40 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
28f50 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
28f60 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
28f70 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
28f80 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
28f90 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
28fa0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
28fb0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
28fc0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
28fd0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
28fe0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
28ff0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29000 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29010 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
29020 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
29030 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
29040 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
29050 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
29060 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
29070 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
29080 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
29090 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
290a0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
290b0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
290c0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
290d0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
290e0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
290f0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
29100 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
29110 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
29120 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
29130 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
29140 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
29150 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
29160 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
29170 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
29180 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
29190 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
291a0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
291b0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
291c0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
291d0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
291e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
291f0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
29200 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
29210 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
29220 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
29230 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29240 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
29250 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
29260 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
29270 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
29280 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29290 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
292a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
292b0 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
292c0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
292d0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
292e0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
292f0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
29300 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
29310 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
29320 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
29330 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
29340 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
29350 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
29360 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
29370 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
29380 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
29390 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
293a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
293b0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
293c0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
293d0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
293e0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
293f0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
29400 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
29410 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
29420 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
29430 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
29440 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
29450 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
29460 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
29470 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
29480 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
29490 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
294a0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
294b0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
294c0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
294d0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
294e0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
294f0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
29500 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
29510 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
29520 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
29530 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
29540 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
29550 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
29560 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
29570 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
29580 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
29590 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
295a0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
295b0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
295c0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
295d0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
295e0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
295f0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
29600 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
29610 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
29620 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
29630 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
29640 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
29650 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
29660 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
29670 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
29680 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
29690 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
296a0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
296b0 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
296c0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
296d0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
296e0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
296f0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
29700 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29710 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
29720 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
29730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29740 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
29750 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
29760 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
29770 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
29780 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
29790 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
297a0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
297b0 20 26 26 20 21 70 42 74 2d 3e 73 65 63 75 72 65   && !pBt->secure
297c0 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
297d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
297e0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
297f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
29800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
29810 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
29820 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
29830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29840 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
29850 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
29860 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
29870 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
29880 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
29890 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
298a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
298b0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
298c0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
298d0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
298e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
298f0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
29900 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
29910 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
29920 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
29930 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
29940 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
29950 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
29960 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
29970 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
29980 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
29990 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
299a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
299b0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
299c0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
299d0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
299e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
299f0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
29a00 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
29a10 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
29a20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
29a30 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
29a40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
29a50 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
29a60 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
29a70 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
29a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29a90 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
29aa0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
29ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29ac0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
29ad0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
29ae0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
29af0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
29b00 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
29b10 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
29b20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29b30 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
29b40 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
29b50 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
29b60 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
29b70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
29b80 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
29b90 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
29ba0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
29bb0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
29bc0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
29bd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
29be0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
29bf0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
29c00 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
29c10 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
29c20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
29c30 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
29c40 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
29c50 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
29c60 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
29c70 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
29c80 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
29c90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
29ca0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
29cb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
29cc0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
29cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
29ce0 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
29cf0 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
29d00 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
29d10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29d20 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
29d30 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
29d40 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
29d50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
29d60 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
29d70 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
29d80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
29d90 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
29da0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29db0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
29dc0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
29dd0 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
29de0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
29df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29e00 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
29e10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
29e20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
29e30 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
29e40 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
29e50 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
29e60 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
29e70 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
29e80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
29e90 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
29ea0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
29eb0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
29ec0 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
29ed0 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
29ee0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
29ef0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
29f00 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
29f10 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
29f20 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
29f30 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
29f40 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
29f50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
29f60 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
29f70 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
29f80 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
29f90 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
29fa0 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
29fb0 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
29fc0 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
29fd0 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
29fe0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
29ff0 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
2a000 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
2a010 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2a020 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
2a030 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
2a040 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
2a050 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2a060 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a070 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2a080 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
2a090 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
2a0a0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
2a0b0 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
2a0c0 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
2a0d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2a0e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2a0f0 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
2a100 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
2a110 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
2a120 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
2a130 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
2a140 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
2a150 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
2a160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2a170 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
2a180 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
2a190 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
2a1a0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2a1b0 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
2a1c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2a1d0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
2a1e0 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
2a1f0 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
2a200 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
2a210 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2a220 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
2a230 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2a240 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
2a250 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
2a260 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
2a270 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
2a280 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2a290 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
2a2a0 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
2a2b0 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
2a2c0 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
2a2d0 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
2a2e0 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
2a2f0 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
2a300 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
2a310 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
2a320 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
2a330 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
2a340 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
2a350 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
2a360 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
2a370 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
2a380 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
2a390 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
2a3a0 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
2a3b0 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
2a3c0 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
2a3d0 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
2a3e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2a3f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a410 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2a420 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
2a430 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
2a440 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
2a450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
2a460 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
2a470 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2a480 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2a490 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
2a4a0 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
2a4b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2a4c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2a4d0 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
2a4e0 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
2a4f0 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
2a500 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
2a510 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
2a520 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
2a530 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
2a540 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2a550 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
2a560 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
2a570 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
2a580 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
2a590 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2a5a0 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2a5b0 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
2a5c0 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
2a5d0 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
2a5e0 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
2a5f0 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
2a600 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2a610 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
2a620 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
2a630 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
2a640 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
2a650 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
2a660 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
2a670 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
2a680 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
2a690 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
2a6a0 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
2a6b0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
2a6c0 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
2a6d0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
2a6e0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2a6f0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
2a700 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2a710 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2a720 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
2a730 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2a740 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
2a750 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
2a760 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
2a770 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2a780 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2a790 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
2a7a0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
2a7b0 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
2a7c0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
2a7d0 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
2a7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2a7f0 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
2a800 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
2a810 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
2a820 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2a830 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
2a840 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
2a850 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
2a860 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
2a870 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
2a880 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
2a890 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
2a8a0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2a8b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
2a8c0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
2a8d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
2a8e0 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
2a8f0 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
2a900 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2a910 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
2a920 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
2a930 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
2a940 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2a950 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2a960 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a970 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2a980 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
2a990 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
2a9a0 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
2a9b0 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
2a9c0 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
2a9d0 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
2a9e0 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
2a9f0 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
2aa00 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
2aa10 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
2aa20 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2aa30 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
2aa40 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2aa50 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2aa60 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2aa70 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2aa80 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2aa90 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
2aaa0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
2aab0 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
2aac0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2aad0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
2aae0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2aaf0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
2ab00 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2ab10 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2ab20 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
2ab30 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
2ab40 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
2ab50 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
2ab60 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
2ab70 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2ab80 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
2ab90 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2aba0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2abb0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
2abc0 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
2abd0 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
2abe0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
2abf0 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
2ac00 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
2ac10 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
2ac20 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
2ac30 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2ac40 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
2ac50 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
2ac60 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
2ac70 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
2ac80 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
2ac90 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
2aca0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
2acb0 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56  se{ .    if( NEV
2acc0 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  ER(nKey>0x7fffff
2acd0 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29  ff || pKey==0) )
2ace0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2acf0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ad00 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
2ad10 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e  ayload += (int)n
2ad20 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
2ad30 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
2ad40 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
2ad50 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
2ad60 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
2ad70 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
2ad80 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
2ad90 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
2ada0 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
2adb0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
2adc0 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
2add0 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
2ade0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
2adf0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2ae00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2ae10 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
2ae20 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
2ae30 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
2ae40 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
2ae50 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
2ae60 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
2ae70 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2ae80 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
2ae90 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
2aea0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
2aeb0 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
2aec0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
2aed0 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
2aee0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
2aef0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
2af00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
2af10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
2af20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2af30 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
2af40 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
2af50 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
2af60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2af70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
2af80 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2af90 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2afa0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
2afb0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
2afc0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
2afd0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
2afe0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
2aff0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
2b000 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2b010 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
2b020 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
2b030 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2b040 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2b050 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
2b060 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
2b070 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
2b080 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
2b090 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
2b0a0 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
2b0b0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
2b0c0 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
2b0d0 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
2b0e0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
2b0f0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
2b100 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
2b110 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
2b120 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
2b130 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75  initialised valu
2b140 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
2b150 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
2b160 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
2b170 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
2b180 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
2b190 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2b1a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b1b0 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
2b1c0 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
2b1d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
2b1e0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
2b1f0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
2b200 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
2b210 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
2b220 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
2b230 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2b240 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2b250 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
2b260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b270 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
2b280 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
2b290 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2b2a0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
2b2b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2b2c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2b2d0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2b2e0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
2b2f0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
2b300 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
2b310 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2b320 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2b330 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2b340 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2b350 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b360 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2b370 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b380 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2b390 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2b3a0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
2b3b0 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
2b3c0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2b3d0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2b3e0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2b3f0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
2b400 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
2b410 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
2b420 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2b430 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
2b440 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2b450 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2b460 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2b470 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2b480 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2b490 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2b4a0 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
2b4b0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2b4c0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2b4d0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
2b4e0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
2b4f0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
2b500 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
2b510 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
2b520 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
2b530 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
2b540 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
2b550 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
2b560 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
2b570 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
2b580 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
2b590 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
2b5a0 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
2b5b0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2b5c0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2b5d0 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
2b5e0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
2b5f0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
2b600 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2b610 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2b620 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2b630 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
2b640 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2b650 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2b660 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2b670 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2b680 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
2b690 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
2b6a0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2b6b0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2b6c0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2b6d0 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
2b6e0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2b6f0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
2b700 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
2b710 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
2b720 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2b730 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2b740 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2b750 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b760 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b770 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
2b780 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
2b790 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
2b7a0 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
2b7b0 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
2b7c0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
2b7d0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
2b7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
2b7f0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
2b800 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
2b810 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
2b820 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
2b830 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
2b840 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
2b850 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
2b860 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
2b870 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
2b880 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
2b890 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
2b8a0 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
2b8b0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2b8c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2b8d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2b8e0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
2b8f0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
2b900 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
2b910 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
2b920 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
2b930 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
2b940 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
2b950 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
2b960 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
2b970 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
2b980 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
2b990 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
2b9a0 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
2b9b0 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
2b9c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
2b9d0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
2b9e0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
2b9f0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2ba00 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
2ba10 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
2ba20 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
2ba30 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2ba40 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
2ba50 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b 20  *pRC){.  int i; 
2ba60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2ba70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33   counter */.  u3
2ba80 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  2 pc;         /*
2ba90 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
2baa0 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
2bab0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
2bac0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2bad0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
2bae0 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
2baf0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2bb00 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
2bb10 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
2bb20 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
2bb30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2bb40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2bb50 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2bb60 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
2bb70 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
2bb80 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
2bb90 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
2bba0 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2bbb0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2bbc0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
2bbd0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
2bbe0 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
2bbf0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
2bc00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2bc10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bc20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2bc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2bc40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2bc50 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2bc60 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
2bc70 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2bc80 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
2bc90 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
2bca0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
2bcb0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
2bcc0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2bcd0 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
2bce0 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
2bcf0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
2bd00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2bd10 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
2bd20 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2bd30 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
2bd40 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2bd50 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
2bd60 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2bd70 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
2bd80 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2bd90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
2bda0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
2bdb0 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
2bdc0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
2bdd0 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
2bde0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2bdf0 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69  n;.  }.  for(i=i
2be00 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
2be10 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
2be20 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
2be30 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
2be40 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
2be50 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2be60 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2be70 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2be80 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2be90 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2bea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2beb0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2bec0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2bed0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2bee0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2bef0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2bf00 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2bf10 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2bf20 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2bf30 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2bf40 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2bf50 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2bf60 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2bf70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2bf80 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2bf90 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2bfa0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2bfb0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2bfc0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2bfd0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2bfe0 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
2bff0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2c000 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2c010 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2c020 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2c030 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2c040 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2c050 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2c060 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2c070 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2c080 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2c090 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2c0a0 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2c0b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2c0c0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2c0d0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2c0e0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2c0f0 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2c100 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2c110 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2c120 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2c130 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2c140 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2c150 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2c160 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2c170 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2c180 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2c190 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2c1a0 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2c1b0 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2c1c0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2c1d0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2c1e0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2c1f0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2c200 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2c210 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2c220 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2c230 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2c240 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2c250 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2c260 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2c270 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2c280 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2c290 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2c2a0 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2c2b0 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2c2c0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2c2d0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2c2e0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2c2f0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2c300 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2c310 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2c320 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2c330 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2c340 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2c350 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2c360 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2c370 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2c380 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2c390 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
2c3a0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2c3b0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2c3c0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2c3d0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2c3e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2c3f0 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2c400 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2c410 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2c420 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2c430 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2c440 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2c450 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2c460 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2c470 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2c480 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2c490 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2c4a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2c4b0 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2c4c0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2c4d0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2c4e0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2c4f0 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2c500 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2c510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2c520 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2c530 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2c540 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
2c550 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
2c560 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
2c570 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2c580 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2c590 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
2c5a0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
2c5b0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
2c5c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2c5d0 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2c5e0 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2c5f0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
2c600 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
2c610 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c620 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
2c630 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
2c640 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c650 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2c660 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2c670 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
2c680 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
2c690 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
2c6a0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
2c6b0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
2c6c0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
2c6d0 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
2c6e0 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
2c6f0 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
2c700 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
2c710 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
2c720 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
2c730 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
2c740 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
2c750 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
2c760 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
2c770 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
2c780 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
2c790 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
2c7a0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
2c7b0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
2c7c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2c7d0 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
2c7e0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2c7f0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2c800 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
2c810 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
2c820 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c830 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
2c840 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
2c850 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
2c860 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
2c870 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
2c880 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2c890 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
2c8a0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
2c8b0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2c8c0 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
2c8d0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2c8e0 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
2c8f0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
2c900 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
2c910 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2c920 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
2c930 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  e->aOvfl[0])) );
2c940 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
2c950 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
2c960 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
2c970 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75  Ovfl[j].idx = (u
2c980 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2c990 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2c9a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2c9b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2c9c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c9d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2c9e0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2c9f0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2ca00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ca10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ca20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2ca30 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2ca40 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2ca50 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2ca60 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2ca70 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2ca80 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2ca90 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2caa0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2cab0 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2cac0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2cad0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2cae0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2caf0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2cb00 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2cb10 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
2cb20 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
2cb30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2cb40 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
2cb50 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
2cb60 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
2cb70 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
2cb80 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
2cb90 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61  t( idx+sz <= pPa
2cba0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2cbb0 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
2cbc0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
2cbd0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2cbe0 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
2cbf0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
2cc00 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
2cc10 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
2cc20 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
2cc30 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2cc40 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
2cc50 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
2cc60 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74     for(j=end, pt
2cc70 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
2cc80 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
2cc90 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
2cca0 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
2ccb0 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
2ccc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
2ccd0 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
2cce0 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
2ccf0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
2cd00 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
2cd10 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
2cd20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2cd30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2cd40 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
2cd50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2cd60 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
2cd70 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
2cd80 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
2cd90 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
2cda0 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
2cdb0 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
2cdc0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2cdd0 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
2cde0 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
2cdf0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2ce00 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
2ce10 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
2ce20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
2ce30 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
2ce40 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
2ce50 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
2ce60 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
2ce70 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
2ce80 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
2ce90 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
2cea0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2ceb0 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
2cec0 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
2ced0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
2cee0 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
2cef0 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
2cf00 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
2cf10 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2cf20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
2cf30 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2cf40 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
2cf50 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2cf60 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
2cf70 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
2cf80 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
2cf90 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
2cfa0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2cfb0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2cfc0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
2cfd0 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
2cfe0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2cff0 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
2d000 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
2d010 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2d020 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
2d030 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
2d040 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2d050 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2d060 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
2d070 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
2d080 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
2d090 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2d0a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2d0b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
2d0c0 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
2d0d0 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
2d0e0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
2d0f0 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
2d100 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
2d110 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2d120 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d130 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2d140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d150 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2d160 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2d170 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
2d180 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2d190 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2d1a0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2d1b0 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73  )<=10921);.  ass
2d1c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2d1d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2d1e0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2d1f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2d200 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
2d210 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
2d220 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
2d230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d240 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2d250 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e  ssert( get2byteN
2d260 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
2d270 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b  +5])==nUsable );
2d280 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26  ..  pCellptr = &
2d290 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2d2a0 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
2d2b0 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
2d2c0 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
2d2d0 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
2d2e0 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70  i--){.    pCellp
2d2f0 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
2d300 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69  lbody -= aSize[i
2d310 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  ];.    put2byte(
2d320 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
2d330 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
2d340 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
2d350 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
2d360 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74  e[i]);.  }.  put
2d370 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2d380 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
2d390 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2d3a0 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
2d3b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
2d3c0 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
2d3d0 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
2d3e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
2d3f0 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
2d400 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2d410 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
2d420 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
2d430 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
2d440 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
2d450 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
2d460 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
2d470 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2d480 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
2d490 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
2d4a0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
2d4b0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2d4c0 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
2d4d0 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
2d4e0 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
2d4f0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
2d500 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
2d510 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
2d520 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
2d530 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2d540 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
2d550 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
2d560 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
2d570 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
2d580 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
2d590 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
2d5a0 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
2d5b0 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
2d5c0 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
2d5d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
2d5e0 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
2d5f0 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
2d600 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
2d610 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
2d620 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
2d630 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
2d640 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
2d650 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
2d660 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
2d670 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
2d680 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
2d690 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2d6a0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
2d6b0 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
2d6c0 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
2d6d0 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
2d6e0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
2d6f0 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
2d700 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2d710 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
2d720 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
2d730 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
2d740 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
2d750 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
2d760 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
2d770 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
2d780 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
2d790 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
2d7a0 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
2d7b0 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
2d7c0 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
2d7d0 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
2d7e0 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
2d7f0 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
2d800 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
2d810 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
2d820 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2d830 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2d840 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2d850 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2d860 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2d870 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2d880 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2d890 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2d8a0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2d8b0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2d8c0 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2d8d0 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2d8e0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2d8f0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2d900 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2d910 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2d920 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2d930 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2d940 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2d950 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2d960 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2d970 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2d980 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2d990 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2d9a0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2d9b0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2d9c0 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2d9d0 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2d9e0 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2d9f0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2da00 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2da10 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2da20 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2da30 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2da40 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2da50 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2da60 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2da70 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2da80 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2da90 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2daa0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2dab0 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2dac0 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2dad0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2dae0 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2daf0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2db00 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2db10 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2db20 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2db30 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2db40 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2db50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2db60 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2db70 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2db80 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2db90 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2dba0 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2dbb0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2dbc0 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2dbd0 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2dbe0 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dc00 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2dc10 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2dc20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc40 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2dc50 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2dc60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dc70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2dc80 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2dc90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2dca0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2dcb0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2dcc0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2dcd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2dce0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2dcf0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2dd00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2dd10 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2dd20 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
2dd30 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77  condition is now
2dd40 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
2dd50 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66   reaching this f
2dd60 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
2dd70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30   pPage->nCell<=0
2dd80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2dd90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
2dda0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
2ddb0 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
2ddc0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
2ddd0 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
2dde0 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
2ddf0 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
2de00 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
2de10 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
2de20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
2de30 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
2de40 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
2de50 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
2de60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
2de70 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
2de80 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2de90 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
2dea0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
2deb0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2dec0 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
2ded0 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
2dee0 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
2def0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
2df00 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
2df10 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  u16 szCell = cel
2df20 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2df30 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a  pCell);.    u8 *
2df40 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65  pStop;..    asse
2df50 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2df60 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77  Iswriteable(pNew
2df70 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2df80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2df90 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f  >aData[0]==(PTF_
2dfa0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2dfb0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b  ATA|PTF_LEAF) );
2dfc0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
2dfd0 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ew, PTF_INTKEY|P
2dfe0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2dff0 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d  LEAF);.    assem
2e000 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
2e010 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
2e020 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e030 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2e040 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2e050 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2e060 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
2e070 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
2e080 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
2e090 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
2e0a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
2e0b0 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
2e0c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2e0d0 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  e. If either of 
2e0e0 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65  these.    ** ope
2e0f0 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74  rations fails, t
2e100 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
2e110 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63  s set, but the c
2e120 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  ontents.    ** o
2e130 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
2e140 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69  e are still mani
2e150 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63  pulated by thh c
2e160 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ode below..    *
2e170 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74  * That is Ok, at
2e180 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
2e190 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67  parent page is g
2e1a0 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
2e1b0 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
2e1c0 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e   dirty. Returnin
2e1d0 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
2e1e0 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20  will cause a.   
2e1f0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e   ** rollback, un
2e200 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65  doing any change
2e210 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61  s made to the pa
2e220 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
2e230 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2e240 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2e250 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2e260 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
2e270 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
2e280 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
2e290 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77   if( szCell>pNew
2e2a0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
2e2b0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
2e2c0 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65  vflPtr(pNew, pCe
2e2d0 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ll, &rc);.      
2e2e0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
2e2f0 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64  * Create a divid
2e300 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  er cell to inser
2e310 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  t into pParent. 
2e320 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  The divider cell
2e330 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73  .    ** consists
2e340 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67   of a 4-byte pag
2e350 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61  e number (the pa
2e360 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61  ge number of pPa
2e370 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ge) and.    ** a
2e380 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2e390 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63   key value (whic
2e3a0 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  h must be the sa
2e3b0 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  me value as the.
2e3c0 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b      ** largest k
2e3d0 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20  ey on pPage)..  
2e3e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66    **.    ** To f
2e3f0 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
2e400 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61  key value on pPa
2e410 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74  ge, first find t
2e420 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20  he right-most . 
2e430 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2e440 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  age. The first t
2e450 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69  wo fields of thi
2e460 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a  s cell are the .
2e470 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65      ** record-le
2e480 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65  ngth (a variable
2e490 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20   length integer 
2e4a0 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20  at most 32-bits 
2e4b0 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20  in size).    ** 
2e4c0 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75  and the key valu
2e4d0 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e (a variable le
2e4e0 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61  ngth integer, ma
2e4f0 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65  y have any value
2e500 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  )..    ** The fi
2e510 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65  rst of the while
2e520 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f  (...) loops belo
2e530 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65  w skips over the
2e540 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20   record-length. 
2e550 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65     ** field. The
2e560 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e   second while(..
2e570 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74  .) loop copies t
2e580 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f  he key value fro
2e590 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c  m the.    ** cel
2e5a0 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20  l on pPage into 
2e5b0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
2e5c0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  r..    */.    pC
2e5d0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2e5e0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
2e5f0 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
2e600 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2e610 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
2e620 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
2e630 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
2e640 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2e650 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2e660 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
2e670 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
2e680 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
2e690 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
2e6a0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
2e6b0 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
2e6c0 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74  t. */.    insert
2e6d0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50  Cell(pParent, pP
2e6e0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53  arent->nCell, pS
2e6f0 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74  pace, (int)(pOut
2e700 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20  -pSpace),.      
2e710 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67           0, pPag
2e720 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a  e->pgno, &rc);..
2e730 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
2e740 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
2e750 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
2e760 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
2e770 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
2e780 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2e790 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2e7a0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2e7b0 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
2e7c0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
2e7d0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2e7e0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2e7f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2e800 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
2e810 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2e820 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
2e830 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
2e840 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
2e850 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2e860 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
2e870 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
2e880 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
2e890 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
2e8a0 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
2e8b0 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
2e8c0 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
2e8d0 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
2e8e0 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
2e8f0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
2e900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2e910 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
2e920 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
2e930 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
2e940 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
2e950 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
2e960 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
2e970 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
2e980 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
2e990 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
2e9a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2e9b0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
2e9c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e9d0 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
2e9e0 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
2e9f0 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
2ea00 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2ea10 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
2ea20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
2ea30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
2ea40 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
2ea50 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2ea60 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  z, &info);.     
2ea70 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2ea80 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
2ea90 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
2eaa0 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65  yte(&z[info.iOve
2eab0 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
2eac0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2ead0 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  ovfl, &e, &n);. 
2eae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2eaf0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2eb00 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46   e==PTRMAP_OVERF
2eb10 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOW1 );.      }.
2eb20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2eb30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2eb40 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2eb50 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20  et4byte(z);.    
2eb60 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2eb70 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2eb80 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2eb90 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2eba0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2ebb0 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  TREE );.      }.
2ebc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
2ebd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ebe0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2ebf0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ec00 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ec10 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2ec20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2ec30 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2ec40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ec50 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2ec60 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2ec70 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EE );.    }.  }.
2ec80 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2ec90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
2eca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2ecb0 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
2ecc0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
2ecd0 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
2ece0 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
2ecf0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2ed00 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
2ed10 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
2ed20 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
2ed30 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2ed40 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
2ed50 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
2ed60 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
2ed70 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
2ed80 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
2ed90 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
2eda0 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
2edb0 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
2edc0 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
2edd0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
2ede0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
2edf0 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
2ee00 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
2ee10 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
2ee20 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
2ee30 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
2ee40 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
2ee50 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
2ee60 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
2ee70 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
2ee80 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
2ee90 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d   MemPage.aOvfl[]
2eea0 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
2eeb0 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
2eec0 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
2eed0 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
2eee0 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
2eef0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
2ef00 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
2ef10 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
2ef20 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
2ef30 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
2ef40 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
2ef50 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
2ef60 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
2ef70 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
2ef80 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
2ef90 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
2efa0 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
2efb0 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
2efc0 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
2efd0 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
2efe0 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
2eff0 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
2f000 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
2f010 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
2f020 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2f030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
2f040 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
2f050 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
2f060 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
2f070 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
2f080 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
2f090 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
2f0a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
2f0b0 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
2f0c0 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
2f0d0 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
2f0e0 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
2f0f0 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
2f100 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
2f110 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
2f120 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
2f130 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
2f140 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f150 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
2f160 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
2f170 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
2f180 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2f190 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  <=pBt->usableSiz
2f1a0 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  e );.  .    /* C
2f1b0 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
2f1c0 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
2f1d0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
2f1e0 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20  age pTo. */.    
2f1f0 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
2f200 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
2f210 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +5]);.    memcpy
2f220 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
2f230 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
2f240 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
2f250 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ta);.    memcpy(
2f260 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
2f270 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
2f280 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
2f290 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
2f2a0 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ll);.  .    /* R
2f2b0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2f2c0 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
2f2d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2f2e0 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
2f2f0 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20  re.    ** match 
2f300 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
2f310 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2f320 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75   of pTo can actu
2f330 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a  ally fail under.
2f340 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62      ** fairly ob
2f350 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e  scure circumstan
2f360 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ces, even though
2f370 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66   it is a copy of
2f380 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   initialized .  
2f390 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e    ** page pFrom.
2f3a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  .    */.    pTo-
2f3b0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
2f3c0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
2f3d0 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66  age(pTo);.    if
2f3e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f3f0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
2f400 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
2f410 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2f420 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2f430 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2f440 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2f450 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2f460 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
2f470 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
2f480 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
2f490 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
2f4a0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
2f4b0 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
2f4c0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2f4d0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
2f4e0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2f4f0 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
2f500 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2f510 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2f520 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
2f530 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
2f540 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
2f550 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
2f560 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
2f570 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
2f580 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
2f590 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
2f5a0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
2f5b0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
2f5c0 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
2f5d0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
2f5e0 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
2f5f0 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
2f600 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
2f610 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
2f620 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
2f630 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
2f640 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2f650 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
2f660 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
2f670 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
2f680 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
2f690 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
2f6a0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
2f6b0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
2f6c0 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
2f6d0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
2f6e0 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
2f6f0 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
2f700 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
2f710 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
2f720 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2f730 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
2f740 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
2f750 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
2f760 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
2f770 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
2f780 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
2f790 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
2f7a0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
2f7b0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
2f7c0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
2f7d0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
2f7e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2f7f0 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
2f800 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
2f810 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
2f820 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
2f830 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
2f840 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
2f850 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
2f860 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
2f870 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
2f880 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2f890 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
2f8a0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
2f8b0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2f8c0 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
2f8d0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
2f8e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2f8f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
2f900 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
2f910 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
2f920 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
2f930 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
2f940 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
2f950 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2f960 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
2f970 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
2f980 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
2f990 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
2f9a0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
2f9b0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
2f9c0 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
2f9d0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
2f9e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2f9f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
2fa00 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
2fa10 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
2fa20 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
2fa30 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
2fa40 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
2fa50 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
2fa60 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2fa70 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
2fa80 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
2fa90 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2faa0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
2fab0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
2fac0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
2fad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
2fae0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
2faf0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2fb00 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2fb10 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2fb20 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
2fb30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2fb40 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
2fb50 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
2fb60 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
2fb70 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
2fb80 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2fb90 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
2fba0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
2fbb0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
2fbc0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
2fbd0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
2fbe0 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
2fbf0 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
2fc00 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
2fc10 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
2fc20 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
2fc30 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
2fc40 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2fc50 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
2fc60 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
2fc70 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
2fc80 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
2fc90 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
2fca0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
2fcb0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
2fcc0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
2fcd0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
2fce0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2fcf0 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
2fd00 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
2fd10 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
2fd20 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
2fd30 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
2fd40 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2fd50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
2fd60 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
2fd70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2fd80 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
2fd90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2fda0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
2fdb0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2fdc0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
2fdd0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2fde0 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
2fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
2fe10 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
2fe20 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
2fe30 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
2fe40 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
2fe50 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
2fe60 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
2fe70 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
2fe80 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
2fe90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2fea0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
2feb0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b   root-page */.){
2fec0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2fed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fee0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
2fef0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
2ff00 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2ff10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ff20 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
2ff30 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2ff40 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
2ff50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2ff60 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
2ff70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
2ff80 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
2ff90 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
2ffa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ffb0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
2ffc0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
2ffd0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2ffe0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2fff0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
30000 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
30010 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
30020 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
30030 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
30040 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
30060 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
30070 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
30080 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
30090 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
300a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
300b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
300c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
300d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
300e0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
300f0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
30100 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
30110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30120 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
30130 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
30140 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
30150 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
30160 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
30170 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
30180 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
30190 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
301a0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
301b0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
301c0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
301d0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
301e0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
301f0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
30200 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
30210 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
30220 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
30230 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30240 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
30250 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
30260 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
30270 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
30280 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
30290 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
302a0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
302b0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
302c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
302d0 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
302e0 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
302f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
30300 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
30310 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
30320 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
30330 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
30340 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
30350 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
30360 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
30370 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
30380 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
30390 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
303a0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
303b0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
303c0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
303d0 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
303e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
303f0 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
30400 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
30410 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
30420 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
30430 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
30440 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
30450 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
30460 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
30470 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30480 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
30490 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
304a0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
304b0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
304c0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
304d0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
304e0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
304f0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
30500 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
30510 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
30520 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
30530 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
30540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30550 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
30560 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
30570 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
30580 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
30590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
305a0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
305b0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
305c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305e0 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
305f0 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
30600 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
30610 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
30620 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
30630 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30640 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
30650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30660 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
30670 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
30680 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
30690 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
306a0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
306b0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
306c0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
306d0 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
306e0 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
306f0 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
30700 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
30710 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
30720 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
30730 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
30740 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
30750 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
30760 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
30770 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
30780 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
30790 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
307a0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
307b0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
307c0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
307d0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
307e0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
307f0 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
30800 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
30810 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
30820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30830 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
30840 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
30850 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50  aOvfl[0].idx==iP
30860 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69  arentIdx );..  i
30870 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29  f( !aOvflSpace )
30880 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30890 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
308a0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69    /* Find the si
308b0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62  bling pages to b
308c0 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63  alance. Also loc
308d0 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  ate the cells in
308e0 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74   pParent .  ** t
308f0 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73  hat divide the s
30900 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65  iblings. An atte
30910 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
30920 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
30930 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  on .  ** either 
30940 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d  side of pPage. M
30950 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
30960 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
30970 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a  side, however, .
30980 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
30990 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
309a0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
309b0 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70  other side. If p
309c0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
309d0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
309e0 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
309f0 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
30a00 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20  t are taken.  . 
30a10 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
30a20 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68  op also drops th
30a30 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
30a40 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
30a50 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  page. This.  ** 
30a60 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64  way, the remaind
30a70 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  er of the functi
30a80 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  on does not have
30a90 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e   to deal with an
30aa0 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  y.  ** overflow 
30ab0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72  cells in the par
30ac0 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20  ent page, since 
30ad0 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74  if any existed t
30ae0 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61  hey will.  ** ha
30af0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
30b00 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  removed..  */.  
30b10 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
30b20 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
30b30 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
30b40 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
30b50 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
30b60 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
30b70 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
30b80 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
30b90 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
30ba0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
30bb0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
30bc0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
30bd0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
30be0 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
30bf0 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
30c00 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
30c10 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
30c20 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
30c30 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
30c40 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
30c50 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
30c60 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
30c70 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
30c80 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
30c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
30ca0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
30cb0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
30cc0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
30cd0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
30ce0 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
30cf0 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
30d00 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
30d10 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
30d20 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
30d30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
30d40 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
30d50 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
30d60 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
30d70 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
30d80 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
30d90 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
30da0 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
30db0 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
30dc0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
30dd0 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
30de0 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
30df0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76  iv==pParent->aOv
30e00 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61  fl[0].idx && pPa
30e10 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
30e20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
30e30 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76  ] = pParent->aOv
30e40 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
30e50 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
30e60 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
30e70 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
30e80 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
30e90 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
30ea0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f       pParent->nO
30eb0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
30ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70   }else{.      ap
30ed0 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
30ee0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
30ef0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
30f00 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67  rflow);.      pg
30f10 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
30f20 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
30f30 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
30f40 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
30f50 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20  pDiv[i]);..     
30f60 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c   /* Drop the cel
30f70 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  l from the paren
30f80 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d  t page. apDiv[i]
30f90 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
30fa0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65  .      ** the ce
30fb0 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ll within the pa
30fc0 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  rent, even thoug
30fd0 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72  h it has been dr
30fe0 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  opped..      ** 
30ff0 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
31000 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20  ause dropping a 
31010 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72  cell only overwr
31020 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20  ites the first. 
31030 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
31040 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68  es of it, and th
31050 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
31060 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69   not need the fi
31070 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
31080 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64  r bytes of the d
31090 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20  ivider cell. So 
310a0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
310b0 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20  afe to use.     
310c0 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a   ** later on.  .
310d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
310e0 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20  * Unless SQLite 
310f0 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73  is compiled in s
31100 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
31110 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
31120 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72  .      ** the dr
31130 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  opCell() routine
31140 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
31150 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
31160 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20  with zeroes..   
31170 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
31180 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  se, temporarily 
31190 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e  copy the cell in
311a0 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  to the aOvflSpac
311b0 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  e[].      ** buf
311c0 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20  fer. It will be 
311d0 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e  copied out again
311e0 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
311f0 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a  aSpace[] buffer.
31200 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f        ** is allo
31210 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  cated.  */.     
31220 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
31230 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
31240 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 53 51 4c    int iOff = SQL
31250 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61  ITE_PTR_TO_INT(a
31260 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54  pDiv[i]) - SQLIT
31270 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61  E_PTR_TO_INT(pPa
31280 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
31290 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b        if( (iOff+
312a0 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70  szNew[i])>(int)p
312b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
312c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
312d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
312e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
312f0 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
31300 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
31310 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
31320 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
31330 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
31340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31350 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c     memcpy(&aOvfl
31360 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44  Space[iOff], apD
31370 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29  iv[i], szNew[i])
31380 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69  ;.          apDi
31390 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61  v[i] = &aOvflSpa
313a0 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
313b0 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20  ent->aData];.   
313c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
313d0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
313e0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
313f0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31400 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63  w, szNew[i], &rc
31410 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
31420 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
31430 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
31440 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
31450 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
31460 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
31470 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
31480 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
31490 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
314a0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
314b0 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
314c0 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74  s.  */.  k = pBt
314d0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55  ->pageSize + ROU
314e0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
314f0 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63  ge));.  szScratc
31500 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
31510 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31530 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
31540 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
31550 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31570 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
31580 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
31590 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315b0 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
315c0 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f  1 */.     + k*nO
315d0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31600 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20  copies (apCopy) 
31610 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
31620 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
31630 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
31640 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
31650 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
31660 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
31670 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31680 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
31690 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
316a0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
316b0 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29   aSpace1 = (u8*)
316c0 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
316d0 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  s];.  assert( EI
316e0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
316f0 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a  NT(aSpace1) );..
31700 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
31710 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
31720 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
31730 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
31740 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
31750 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
31760 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
31770 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
31780 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
31790 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
317a0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
317b0 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65  aSpace1[] and re
317c0 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76  move the the div
317d0 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20  ider Cells.  ** 
317e0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
317f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
31800 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
31810 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
31820 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
31830 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
31840 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
31850 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
31860 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
31870 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
31880 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
31890 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
318a0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
318b0 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
318c0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
318d0 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
318e0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
318f0 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
31900 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
31910 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
31920 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
31930 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
31940 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
31950 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
31960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
31970 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
31980 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
31990 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
319a0 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
319b0 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
319c0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
319d0 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
319e0 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
319f0 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
31a00 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
31a10 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
31a20 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
31a30 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
31a40 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
31a50 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
31a60 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
31a70 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
31a80 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
31a90 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
31aa0 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
31ab0 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
31ac0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
31ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
31ae0 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
31af0 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
31b00 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
31b10 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
31b20 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
31b30 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
31b40 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
31b50 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
31b60 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
31b70 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
31b80 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
31b90 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
31ba0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
31bb0 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
31bc0 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
31bd0 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
31be0 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
31bf0 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
31c00 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
31c10 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
31c20 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
31c30 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
31c40 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
31c50 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
31c60 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
31c70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
31c80 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
31c90 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
31ca0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31cb0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
31cc0 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
31cd0 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
31ce0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
31cf0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
31d00 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
31d10 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c  l]);.      nCell
31d20 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
31d30 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c  ( i<nOld-1 && !l
31d40 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20  eafData){.      
31d50 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a  u16 sz = (u16)sz
31d60 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
31d70 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
31d80 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
31d90 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
31da0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
31db0 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
31dc0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
31dd0 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
31de0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
31df0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
31e00 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
31e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
31e20 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
31e30 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65  Size );.      me
31e40 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
31e50 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
31e60 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
31e70 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
31e80 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73  ction;.      ass
31e90 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
31ea0 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f  ion==0 || leafCo
31eb0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
31ec0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
31ed0 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c  l] = szCell[nCel
31ee0 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74  l] - leafCorrect
31ef0 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
31f00 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
31f10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
31f20 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
31f30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31f40 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  t( pOld->hdrOffs
31f50 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  et==0 );.       
31f60 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
31f70 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
31f80 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
31f90 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
31fa0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
31fb0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
31fc0 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
31fd0 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
31fe0 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
31ff0 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[8], 4);.     
32000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32010 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
32020 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
32030 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
32040 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
32050 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
32060 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20  allow any cells 
32070 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62  smaller than 4 b
32080 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ytes. */.       
32090 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
320a0 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 4;.        }.
320b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
320c0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell++;.    }.  }
320d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
320e0 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
320f0 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
32100 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
32110 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
32120 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
32130 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
32140 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
32150 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
32160 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
32170 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
32180 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
32190 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
321a0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
321b0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
321c0 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
321d0 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
321e0 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
321f0 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
32200 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
32210 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
32220 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
32230 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
32240 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
32250 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
32260 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
32270 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
32280 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
32290 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
322a0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
322b0 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
322c0 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
322d0 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
322e0 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
322f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
32300 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
32310 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
32320 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
32330 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
32340 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
32350 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
32360 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
32370 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
32380 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
32390 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
323a0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
323b0 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
323c0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
323d0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
323e0 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
323f0 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
32400 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
32410 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
32420 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
32430 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
32440 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
32450 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
32460 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
32470 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
32480 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
32490 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
324a0 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66     k++;.      if
324b0 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d  ( k>NB+1 ){ rc =
324c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
324d0 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  BKPT; goto balan
324e0 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
324f0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
32500 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
32510 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
32520 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
32530 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
32540 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
32550 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
32560 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
32570 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
32580 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
32590 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
325a0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
325b0 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
325c0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
325d0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
325e0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
325f0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
32600 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
32610 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
32620 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
32630 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
32640 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
32650 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
32660 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
32670 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
32680 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
32690 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
326a0 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
326b0 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
326c0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
326d0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
326e0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
326f0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
32700 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
32710 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
32720 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
32730 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
32740 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
32750 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
32760 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
32770 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
32780 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
32790 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
327a0 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
327b0 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
327c0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
327d0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
327e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
327f0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
32800 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
32810 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
32820 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
32830 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
32840 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
32850 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
32860 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
32870 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
32880 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
32890 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
328a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
328b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
328c0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
328d0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
328e0 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
328f0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
32900 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
32910 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
32920 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
32930 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
32940 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
32950 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
32960 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
32970 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
32980 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
32990 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
329a0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
329b0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
329c0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
329d0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
329e0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
329f0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
32a00 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
32a10 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
32a20 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
32a30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
32a40 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
32a50 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
32a60 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
32a70 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
32a80 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
32a90 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
32aa0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
32ab0 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
32ac0 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
32ad0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
32ae0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
32af0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
32b00 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
32b10 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b  d  ",.    apOld[
32b20 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e  0]->pgno, .    n
32b30 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31  Old>=2 ? apOld[1
32b40 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20  ]->pgno : 0,.   
32b50 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64   nOld>=3 ? apOld
32b60 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20  [2]->pgno : 0.  
32b70 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ));..  /*.  ** A
32b80 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
32b90 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
32ba0 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
32bb0 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ible..  */.  if(
32bc0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c   apOld[0]->pgno<
32bd0 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =1 ){.    rc = S
32be0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32bf0 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  PT;.    goto bal
32c00 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
32c10 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  }.  pageFlags = 
32c20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b  apOld[0]->aData[
32c30 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
32c40 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  <k; i++){.    Me
32c50 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  mPage *pNew;.   
32c60 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20   if( i<nOld ){. 
32c70 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
32c80 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
32c90 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
32ca0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
32cb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32cc0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
32cd0 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
32ce0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
32cf0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
32d00 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nup;.    }else{.
32d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
32d20 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
32d30 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
32d40 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
32d50 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  gno, pgno, 0);. 
32d60 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
32d70 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
32d80 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
32d90 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  i] = pNew;.     
32da0 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20   nNew++;..      
32db0 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  /* Set the point
32dc0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
32dd0 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
32de0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
32df0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
32e00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d   ){.        ptrm
32e10 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
32e20 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
32e30 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
32e40 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
32e50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32e60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32e70 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32e80 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
32e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32ea0 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
32eb0 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74  y old pages that
32ec0 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64   were not reused
32ed0 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20   as new pages.. 
32ee0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   */.  while( i<n
32ef0 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50  Old ){.    freeP
32f00 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72  age(apOld[i], &r
32f10 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
32f20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32f30 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61  eanup;.    relea
32f40 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
32f50 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d  ;.    apOld[i] =
32f60 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d   0;.    i++;.  }
32f70 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20  ..  /*.  ** Put 
32f80 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e  the new pages in
32f90 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
32fa0 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f  .  This helps to
32fb0 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69  .  ** keep entri
32fc0 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
32fd0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20  ile in order so 
32fe0 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a  that a scan.  **
32ff0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
33000 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
33010 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e  hrough the file.
33020 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74    That.  ** in t
33030 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70  urn helps the op
33040 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74  erating system t
33050 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a  o deliver pages.
33060 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69    ** from the di
33070 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e  sk more rapidly.
33080 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28  .  **.  ** An O(
33090 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73  n^2) insertion s
330a0 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ort algorithm is
330b0 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65   used, but since
330c0 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72  .  ** n is never
330d0 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61   more than NB (a
330e0 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29   small constant)
330f0 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20  , that should.  
33100 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ** not be a prob
33110 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  lem..  **.  ** W
33120 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20  hen NB==3, this 
33130 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  one optimization
33140 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62   makes the datab
33150 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32  ase.  ** about 2
33160 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  5% faster for la
33170 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61  rge insertions a
33180 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20  nd deletions..  
33190 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
331a0 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  k-1; i++){.    i
331b0 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b  nt minV = apNew[
331c0 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e  i]->pgno;.    in
331d0 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
331e0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
331f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
33200 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28  apNew[j]->pgno<(
33210 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
33220 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
33230 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
33240 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  = apNew[j]->pgno
33250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33260 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
33270 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
33280 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  *pT;.      pT = 
33290 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
332a0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
332b0 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
332c0 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
332d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
332e0 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20  E(("new: %d(%d) 
332f0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
33300 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
33310 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67      apNew[0]->pg
33320 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  no, szNew[0],.  
33330 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65    nNew>=2 ? apNe
33340 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[1]->pgno : 0, 
33350 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
33360 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
33370 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e  >=3 ? apNew[2]->
33380 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
33390 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
333a0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
333b0 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a  apNew[3]->pgno :
333c0 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
333d0 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
333e0 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b  nNew>=5 ? apNew[
333f0 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  4]->pgno : 0, nN
33400 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
33410 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72   : 0));..  asser
33420 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
33430 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
33440 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
33450 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68    put4byte(pRigh
33460 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  t, apNew[nNew-1]
33470 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20  ->pgno);..  /*. 
33480 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
33490 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
334a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
334b0 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
334c0 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
334d0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
334e0 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
334f0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
33500 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
33510 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
33520 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
33530 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
33540 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
33550 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
33560 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
33570 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
33580 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
33590 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
335a0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
335b0 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
335c0 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
335d0 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
335e0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
335f0 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
33600 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
33610 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
33620 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
33630 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20  ==0 );..    j = 
33640 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
33650 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
33660 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
33670 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
33680 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
33690 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
336a0 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
336b0 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
336c0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
336d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
336e0 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c  New-1 || j==nCel
336f0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e  l );.    if( j<n
33700 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
33710 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
33720 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
33730 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
33740 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
33750 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
33760 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
33770 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
33780 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
33790 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  tion;.      pTem
337a0 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  p = &aOvflSpace[
337b0 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20  iOvflSpace];.   
337c0 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65     if( !pNew->le
337d0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  af ){.        me
337e0 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74  mcpy(&pNew->aDat
337f0 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b  a[8], pCell, 4);
33800 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33810 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
33820 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
33830 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
33840 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
33850 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
33860 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
33870 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
33880 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
33890 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
338a0 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
338b0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
338c0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
338d0 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
338e0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
338f0 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
33900 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
33910 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
33920 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
33930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33940 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
33950 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
33960 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
33970 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
33980 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
33990 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70         pCell = p
339a0 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a  Temp;.        sz
339b0 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74   = 4 + putVarint
339c0 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f  (&pCell[4], info
339d0 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  .nKey);.        
339e0 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
339f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33a00 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
33a10 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
33a20 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
33a30 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
33a40 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
33a50 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
33a60 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
33a70 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
33a80 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
33a90 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
33aa0 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
33ab0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
33ac0 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
33ad0 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
33ae0 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65      ** (see btre
33af0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
33b00 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
33b10 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
33b20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
33b30 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
33b40 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
33b50 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
33b60 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
33b70 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
33b80 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
33b90 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
33ba0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
33bb0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
33bc0 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
33bd0 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
33be0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
33bf0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
33c00 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
33c10 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
33c20 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
33c30 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
33c40 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
33c50 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
33c60 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
33c70 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
33c80 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
33c90 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
33ca0 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
33cb0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
33cc0 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
33cd0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
33ce0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
33cf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33d00 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d     iOvflSpace +=
33d10 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
33d20 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c  t( sz<=pBt->maxL
33d30 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20  ocal+23 );.     
33d40 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70   assert( iOvflSp
33d50 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
33d60 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
33d70 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
33d80 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
33d90 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
33da0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
33db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33dc0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
33dd0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
33de0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33df0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33e00 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
33e10 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
33e20 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
33e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
33e40 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
33e50 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
33e60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
33e70 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
33e80 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
33e90 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
33ea0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
33eb0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
33ec0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
33ed0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
33ee0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
33ef0 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
33f00 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
33f10 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
33f20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
33f30 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
33f40 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
33f50 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
33f60 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
33f70 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
33f80 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
33f90 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
33fa0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
33fb0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
33fc0 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
33fd0 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
33fe0 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
33ff0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
34000 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
34010 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
34020 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
34030 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
34040 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
34050 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
34060 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
34070 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
34080 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
34090 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
340a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
340b0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
340c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
340d0 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
340e0 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
340f0 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
34100 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
34110 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
34120 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
34130 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
34140 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
34150 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
34160 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
34170 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
34180 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
34190 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
341a0 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
341b0 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
341c0 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
341d0 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
341e0 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
341f0 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
34200 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
34210 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
34220 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
34230 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
34240 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
34250 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
34260 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
34270 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
34280 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
34290 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
342a0 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
342b0 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
342c0 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
342d0 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
342e0 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
342f0 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
34300 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
34310 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
34320 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
34330 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
34340 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
34350 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
34360 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34370 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
34380 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34390 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
343a0 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
343b0 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
343c0 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
343d0 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
343e0 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
343f0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
34400 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
34410 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
34420 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
34430 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
34440 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
34450 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
34460 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
34470 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
34480 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
34490 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
344a0 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
344b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
344c0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
344d0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
344e0 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
344f0 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
34500 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
34510 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
34520 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
34530 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
34540 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
34550 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
34560 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
34570 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
34580 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
34590 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
345a0 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
345b0 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
345c0 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
345d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
345e0 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
345f0 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
34600 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
34610 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
34620 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
34630 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
34640 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
34650 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
34660 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
34670 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
34680 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
34690 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
346a0 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
346b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
346c0 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
346d0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
346e0 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
346f0 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
34700 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
34710 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
34720 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
34730 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
34740 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
34750 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
34760 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
34770 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
34780 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
34790 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
347a0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
347b0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
347c0 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
347d0 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
347e0 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
347f0 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
34800 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
34810 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
34820 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
34830 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
34840 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
34850 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
34860 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
34870 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
34880 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
34890 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
348a0 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
348b0 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
348c0 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
348d0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
348e0 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
348f0 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
34900 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
34910 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
34920 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
34930 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
34940 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
34950 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
34960 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
34970 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
34980 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
34990 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
349a0 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
349b0 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
349c0 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
349d0 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
349e0 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
349f0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
34a00 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
34a10 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
34a20 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
34a30 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
34a40 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
34a50 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
34a60 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
34a70 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
34a80 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
34a90 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
34aa0 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
34ab0 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
34ac0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
34ad0 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
34ae0 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ow ? pOld->aOvfl
34af0 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20  [0].idx : -1);. 
34b00 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
34b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
34b30 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
34b40 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
34b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34b70 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
34b80 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
34b90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
34ba0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
34bb0 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d   int isDivider =
34bc0 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
34bd0 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a   i==iNextOld ){.
34be0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
34bf0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
34c00 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
34c10 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
34c20 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20  l on old.       
34c30 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
34c40 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   j. If the sibli
34c50 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
34c60 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
34c70 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
34c80 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
34c90 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72   i was a divider
34ca0 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
34cb0 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b    pOld = apCopy[
34cc0 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e  ++j];.        iN
34cd0 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65  extOld = i + !le
34ce0 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e  afData + pOld->n
34cf0 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76  Cell + pOld->nOv
34d00 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
34d10 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
34d20 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
34d30 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
34d40 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
34d50 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
34d60 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  w = i + !leafDat
34d70 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  a + pOld->aOvfl[
34d80 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  0].idx;.        
34d90 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
34da0 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
34db0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
34dc0 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
34dd0 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
34de0 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
34df0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
34e00 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30  || pOld->aOvfl[0
34e10 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
34e20 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[1].idx-1);.  
34e30 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
34e40 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<3 || pOld->
34e50 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[1].idx==pO
34e60 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78  ld->aOvfl[2].idx
34e70 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  -1);.      if( i
34e80 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ==iOverflow ){. 
34e90 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
34ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
34eb0 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e  ( (--nOverflow)>
34ec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
34ed0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
34ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
34ef0 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e       if( i==cntN
34f00 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20  ew[k] ){.       
34f10 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
34f20 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
34f30 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
34f40 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65   last cell on ne
34f50 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  w.        ** sib
34f60 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20  ling page k. If 
34f70 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
34f80 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
34f90 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
34fa0 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
34fb0 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61  then cell i is a
34fc0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20   divider cell.  
34fd0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
34fe0 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20  = apNew[++k];.  
34ff0 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44        if( !leafD
35000 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ata ) continue;.
35010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
35020 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
35030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
35040 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
35050 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
35060 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
35070 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
35080 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
35090 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
350a0 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
350b0 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
350c0 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
350d0 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
350e0 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
350f0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
35100 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
35110 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
35120 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
35130 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
35140 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
35150 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
35160 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
35170 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
35180 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
35190 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
351a0 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
351b0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
351c0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
351d0 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
351e0 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
351f0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  REE, pNew->pgno,
35200 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
35210 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
35220 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
35230 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
35240 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
35250 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
35260 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  [i], &rc);.     
35270 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35280 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61   }..    if( !lea
35290 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
352a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
352b0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
352c0 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65      u32 key = ge
352d0 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d  t4byte(&apNew[i]
352e0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
352f0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
35300 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f  Bt, key, PTRMAP_
35310 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
35320 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
35330 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20     }.    }..#if 
35340 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72  0.    /* The ptr
35350 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20  mapCheckPages() 
35360 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28  contains assert(
35370 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
35380 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20  t verify that.  
35390 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72    ** all pointer
353a0 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73   map pages are s
353b0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68  et correctly. Th
353c0 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68  is is helpful wh
353d0 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75  ile .    ** debu
353e0 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75  gging. This is u
353f0 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20  sually disabled 
35400 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70  because a corrup
35410 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20  t database may. 
35420 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61     ** cause an a
35430 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
35440 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20  t to fail.  */. 
35450 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
35460 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29  ges(apNew, nNew)
35470 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  ;.    ptrmapChec
35480 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c  kPages(&pParent,
35490 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   1);.#endif.  }.
354a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
354b0 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
354c0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
354d0 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25   finished: old=%
354e0 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
354f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35500 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
35510 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  l));..  /*.  ** 
35520 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
35530 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
35540 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
35550 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
35560 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
35570 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
35580 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
35590 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
355a0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
355b0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
355c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
355d0 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20  pNew[i]);.  }.. 
355e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
355f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
35600 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
35610 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
35620 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
35630 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
35640 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
35650 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
35660 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
35670 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
35680 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
35690 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
356a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
356b0 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
356c0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
356d0 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
356e0 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
356f0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
35700 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
35710 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61  ten to make it a
35720 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
35730 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  h the right-chil
35740 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f  d .** pointer po
35750 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
35760 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  w page..**.** Be
35770 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
35780 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
35790 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
357a0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a  nding to pages .
357b0 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
357c0 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63  child-page now c
357d0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
357e0 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e   to are updated.
357f0 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f   The.** entry co
35800 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
35810 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
35820 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ld pointer of th
35830 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
35840 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a  s also updated..
35850 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
35860 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73  ful, *ppChild is
35870 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
35880 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
35890 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67  he child .** pag
358a0 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
358b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
358c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
358d0 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64  ller is required
358e0 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  .** to call rele
358f0 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70  asePage() on *pp
35900 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e  Child exactly on
35910 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ce. If an error 
35920 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
35930 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
35940 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c  rned and *ppChil
35950 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
35960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
35970 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
35980 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50  age *pRoot, MemP
35990 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a  age **ppChild){.
359a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
359d0 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
359e0 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
359f0 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20   *pChild = 0;   
35a00 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
35a10 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
35a20 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
35a30 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20   pgnoChild = 0; 
35a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
35a50 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
35a60 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
35a70 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
35a80 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b  Bt = pRoot->pBt;
35a90 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
35aa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
35ab0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Root->nOverflow>
35ac0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
35ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35ae0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
35af0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f  ..  /* Make pRoo
35b00 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  t, the root page
35b10 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20   of the b-tree, 
35b20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61  writable. Alloca
35b30 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70  te a new .  ** p
35b40 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
35b50 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67  come the new rig
35b60 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ht-child of pPag
35b70 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  e. Copy the cont
35b80 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
35b90 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20   node stored on 
35ba0 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e  pRoot into the n
35bb0 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ew child page.. 
35bc0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
35bd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
35be0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
35bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35c00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  K ){.    rc = al
35c10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
35c20 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
35c30 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
35c40 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e  no,0);.    copyN
35c50 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74  odeContent(pRoot
35c60 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a  , pChild, &rc);.
35c70 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
35c80 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
35c90 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
35ca0 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
35cb0 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
35cc0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
35cd0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
35ce0 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b     *ppChild = 0;
35cf0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35d00 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65  (pChild);.    re
35d10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
35d20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35d30 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35d40 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
35d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35d60 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
35d70 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
35d80 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
35d90 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
35da0 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b  =pRoot->nCell );
35db0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
35dc0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
35dd0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52  d into %d\n", pR
35de0 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  oot->pgno, pChil
35df0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a  d->pgno));..  /*
35e00 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c   Copy the overfl
35e10 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52  ow cells from pR
35e20 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f  oot to pChild */
35e30 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64  .  memcpy(pChild
35e40 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
35e50 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f  aOvfl, pRoot->nO
35e60 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
35e70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Root->aOvfl[0]))
35e80 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
35e90 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e  rflow = pRoot->n
35ea0 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20  Overflow;..  /* 
35eb0 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  Zero the content
35ec0 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e  s of pRoot. Then
35ed0 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20   install pChild 
35ee0 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  as the right-chi
35ef0 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67  ld. */.  zeroPag
35f00 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d  e(pRoot, pChild-
35f10 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
35f20 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
35f30 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
35f40 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
35f50 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
35f60 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  ;..  *ppChild = 
35f70 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e  pChild;.  return
35f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
35f90 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
35fa0 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
35fb0 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
35fc0 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
35fd0 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
35fe0 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
35ff0 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
36000 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
36010 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
36020 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
36030 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
36040 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
36050 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
36060 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
36070 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   Balancing routi
36080 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  nes are:.**.**  
36090 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
360a0 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65  .**   balance_de
360b0 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61  eper().**   bala
360c0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f  nce_nonroot().*/
360d0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
360e0 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
360f0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
36100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
36110 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
36120 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
36130 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
36140 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
36150 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
36160 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
36170 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
36180 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
36190 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
361a0 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
361b0 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
361c0 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
361d0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
361e0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
361f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
36200 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
36210 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
36220 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
36230 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
36240 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
36250 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
36260 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
36270 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
36280 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
36290 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
362a0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
362b0 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
362c0 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
362d0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
362e0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
362f0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
36300 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
36310 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
36320 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
36330 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
36340 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
36350 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
36360 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
36370 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
36380 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
36390 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
363a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
363b0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
363c0 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
363d0 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
363e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
363f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36400 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
36410 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
36420 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
36430 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
36440 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
36450 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
36460 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
36470 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
36480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36490 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72  else{.        br
364a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
364b0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
364c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
364d0 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d  & pPage->nFree<=
364e0 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72  nMin ){.      br
364f0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
36500 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20        MemPage * 
36510 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20  const pParent = 
36520 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
36530 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  ge-1];.      int
36540 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43   const iIdx = pC
36550 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d  ur->aiIdx[iPage-
36560 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  1];..      rc = 
36570 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36580 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
36590 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
365a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
365b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
365c0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
365d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
365e0 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20  ge->hasData.    
365f0 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e       && pPage->n
36600 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20  Overflow==1.    
36610 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61       && pPage->a
36620 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
36630 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  ge->nCell.      
36640 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70     && pParent->p
36650 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20  gno!=1.         
36660 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
36670 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20  l==iIdx.        
36680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
36690 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  Call balance_qui
366a0 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ck() to create a
366b0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20   new sibling of 
366c0 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20  pPage on which. 
366d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
366e0 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  tore the overflo
366f0 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f  w cell. balance_
36700 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20  quick() inserts 
36710 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20  a new cell.     
36720 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61       ** into pPa
36730 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
36740 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76  cause pParent ov
36750 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a  erflow. If this.
36760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
36770 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69  pens, the next i
36780 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  nteration of the
36790 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
367a0 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20  lance pParent . 
367b0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
367c0 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e  either balance_n
367d0 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61  onroot() or bala
367e0 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e  nce_deeper(). Un
367f0 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20  til this.       
36800 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
36810 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
36820 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
36830 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
36840 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  pace[].         
36850 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20   ** buffer. .   
36860 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
36870 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f      ** The purpo
36880 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
36890 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20  ing assert() is 
368a0 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e  to check that on
368b0 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  ly a.          *
368c0 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  * single call to
368d0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
368e0 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63   is made for eac
368f0 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  h call to this. 
36900 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
36910 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65  tion. If this we
36920 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c  re not verified,
36930 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e   a subtle bug in
36940 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20  volving reuse.  
36950 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
36960 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
36970 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65  pace[] might sne
36980 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20  ak in..         
36990 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
369a0 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71  sert( (balance_q
369b0 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  uick_called++)==
369c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
369d0 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  c = balance_quic
369e0 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65  k(pParent, pPage
369f0 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  , aBalanceQuickS
36a00 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  pace);.        }
36a10 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
36a20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
36a30 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
36a40 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f   call balance_no
36a50 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73  nroot() to redis
36a60 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20  tribute cells.  
36a70 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
36a80 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  en pPage and up 
36a90 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c  to 2 of its sibl
36aa0 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
36ab0 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20  involves.       
36ac0 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20     ** modifying 
36ad0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36ae0 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
36af0 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
36b00 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
36b10 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
36b20 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54   or underfull. T
36b30 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
36b40 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
36b50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69  .          ** wi
36b60 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  ll balance the p
36b70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f  arent page to co
36b80 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20  rrect this..    
36b90 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
36ba0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61      ** If the pa
36bb0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
36bc0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20  s overfull, the 
36bd0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72  overflow cell or
36be0 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
36bf0 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69   ** are stored i
36c00 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  n the pSpace buf
36c10 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d  fer allocated im
36c20 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e  mediately below.
36c30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41   .          ** A
36c40 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
36c50 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
36c60 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  loop will deal w
36c70 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20  ith this by.    
36c80 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
36c90 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36ca0 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  () (balance_deep
36cb0 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  er() may be call
36cc0 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20  ed first,.      
36cd0 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f      ** but it do
36ce0 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20  esn't deal with 
36cf0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d  overflow cells -
36d00 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d   just moves them
36d10 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20   to a.          
36d20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  ** different pag
36d30 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75  e). Once this su
36d40 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
36d50 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36d60 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  () .          **
36d70 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20   has completed, 
36d80 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
36d90 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65  lease the pSpace
36da0 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a   buffer used by.
36db0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
36dc0 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20   previous call, 
36dd0 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  as the overflow 
36de0 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68  cell data will h
36df0 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20  ave been .      
36e00 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69      ** copied ei
36e10 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f  ther into the bo
36e20 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  dy of a database
36e30 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68   page or into th
36e40 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20  e new.          
36e50 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ** pSpace buffer
36e60 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c   passed to the l
36e70 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61  atter call to ba
36e80 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
36e90 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
36ea0 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61          u8 *pSpa
36eb0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
36ec0 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74  Malloc(pCur->pBt
36ed0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
36ee0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
36ef0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72  nce_nonroot(pPar
36f00 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63  ent, iIdx, pSpac
36f10 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20  e, iPage==1);.  
36f20 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
36f30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
36f40 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20   /* If pFree is 
36f50 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
36f60 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63  nts to the pSpac
36f70 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20  e buffer used . 
36f80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79             ** by
36f90 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
36fa0 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
36fb0 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65  oot(). Its conte
36fc0 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  nts are.        
36fd0 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65      ** now store
36fe0 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c  d either on real
36ff0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
37000 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20  or within the . 
37010 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
37020 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c  w pSpace buffer,
37030 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61   so it may be sa
37040 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e  fely freed here.
37050 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
37060 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
37070 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  pFree);.        
37080 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
37090 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
370a0 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65  fer will be free
370b0 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74  d after the next
370c0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
370d0 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f     ** balance_no
370e0 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74  nroot(), or just
370f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
37100 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77  ction returns, w
37110 68 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20  hichever.       
37120 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73     ** comes firs
37130 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
37140 70 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a  pFree = pSpace;.
37150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37160 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  }..      pPage->
37170 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
37180 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
37190 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
371a0 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e  he do-loop balan
371b0 63 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70  ces the parent p
371c0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  age. */.      re
371d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
371e0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50  ;.      pCur->iP
371f0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
37200 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
37210 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
37220 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
37230 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
37240 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
37250 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
37260 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
37270 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
37280 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
37290 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
372a0 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
372b0 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
372c0 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
372d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
372e0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
372f0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
37300 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
37310 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
37320 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
37330 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
37340 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
37350 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
37360 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
37370 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
37380 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
37390 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
373a0 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
373b0 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
373c0 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
373d0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
373e0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
373f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
37400 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
37410 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
37420 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  en a successful 
37430 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74  call to.** Movet
37440 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73  oUnpacked() to s
37450 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20  eek cursor pCur 
37460 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20  to (pKey, nKey) 
37470 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
37480 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73  een performed. s
37490 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65  eekResult is the
374a0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72   search result r
374b0 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74  eturned (a negat
374c0 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66  ive.** number if
374d0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
374e0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73  an entry that is
374f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70   smaller than (p
37500 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a  Key, nKey), or.*
37510 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  * a positive val
37520 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  ue if pCur point
37530 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61  s at an etry tha
37540 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
37550 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79   .** (pKey, nKey
37560 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  )). .**.** If th
37570 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
37580 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
37590 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ro, then the cal
375a0 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
375b0 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43  hat.** cursor pC
375c0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 61  ur is pointing a
375d0 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  t the existing c
375e0 6f 70 79 20 6f 66 20 61 20 72 6f 77 20 74 68 61  opy of a row tha
375f0 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76  t is to be.** ov
37600 65 72 77 72 69 74 74 65 6e 2e 20 20 49 66 20 74  erwritten.  If t
37610 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
37620 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
37630 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d  en cursor pCur m
37640 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ay.** point to a
37650 6e 79 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e  ny entry or to n
37660 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 20 61  o entry at all a
37670 6e 64 20 73 6f 20 74 68 69 73 20 66 75 6e 63 74  nd so this funct
37680 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a  ion has to seek.
37690 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  ** the cursor be
376a0 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79  fore the new key
376b0 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64   can be inserted
376c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
376d0 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
376e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37700 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
37710 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
37720 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
37730 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
37740 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
37750 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
37760 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
37770 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
37780 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  ta, int nData,  
37790 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
377a0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
377b0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
377e0 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20  xtra 0 bytes to 
377f0 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
37800 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69  /.  int appendBi
37810 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  as,             
37820 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
37830 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20  is is likely an 
37840 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
37850 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20  seekResult      
37860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37870 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f  sult of prior Mo
37880 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 63  vetoUnpacked() c
37890 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
378a0 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
378b0 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 20 20  seekResult;     
378c0 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f       /* -1: befo
378d0 72 65 20 64 65 73 69 72 65 64 20 6c 6f 63 61 74  re desired locat
378e0 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65 72 20 2a  ion  +1: after *
378f0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 20 3d 20  /.  int szNew = 
37900 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  0;.  int idx;.  
37910 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
37920 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
37930 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
37940 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
37950 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
37960 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20  char *oldCell;. 
37970 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
37980 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20  newCell = 0;..  
37990 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
379a0 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
379b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
379c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
379d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
379e0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
379f0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Next;.  }..  ass
37a00 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
37a10 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
37a20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77   assert( pCur->w
37a30 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rFlag && pBt->in
37a40 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
37a50 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70 42 74  NS_WRITE && !pBt
37a60 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
37a70 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
37a80 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
37a90 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
37aa0 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
37ab0 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f  o!=0, 2) );..  /
37ac0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
37ad0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62 65 65  e caller has bee
37ae0 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66  n consistent. If
37af0 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73   this cursor was
37b00 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65 78 70   opened.  ** exp
37b10 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  ecting an index 
37b20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65  b-tree, then the
37b30 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62   caller should b
37b40 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62  e inserting blob
37b50 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74 68 20  .  ** keys with 
37b60 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  no associated da
37b70 74 61 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  ta. If the curso
37b80 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65 78 70  r was opened exp
37b90 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a 20 69  ecting an.  ** i
37ba0 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
37bb0 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62   caller should b
37bc0 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 65  e inserting inte
37bd0 67 65 72 20 6b 65 79 73 20 77 69 74 68 20 61 0a  ger keys with a.
37be0 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 73 73    ** blob of ass
37bf0 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 20 2a  ociated data.  *
37c00 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 4b 65  /.  assert( (pKe
37c10 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
37c20 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
37c30 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
37c40 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20  n insert into a 
37c50 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e  table b-tree, in
37c60 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
37c70 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73  rblob .  ** curs
37c80 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
37c90 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63  row being replac
37ca0 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69  ed (assuming thi
37cb0 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20  s is a replace. 
37cc0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20   ** operation - 
37cd0 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  if it is not, th
37ce0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
37cf0 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69   no-op).  */.  i
37d00 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
37d10 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
37d20 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
37d30 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79 2c 20 30  rsors(p, nKey, 0
37d40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  );.  }..  /* Sav
37d50 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
37d60 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
37d70 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
37d80 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  s table..  **.  
37d90 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  ** In some cases
37da0 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74  , the call to bt
37db0 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f  reeMoveto() belo
37dc0 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f  w is a no-op. Fo
37dd0 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  r.  ** example, 
37de0 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
37df0 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
37e00 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72   with auto-gener
37e10 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a  ated integer.  *
37e20 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45  * keys, the VDBE
37e30 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73   layer invokes s
37e40 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
37e50 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
37e60 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65  the .  ** intege
37e70 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74  r key to use. It
37e80 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73   then calls this
37e90 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74   function to act
37ea0 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65  ually insert the
37eb0 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f   .  ** data into
37ec0 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72   the intkey B-Tr
37ed0 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
37ee0 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72   btreeMoveto() r
37ef0 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74  ecognizes.  ** t
37f00 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
37f10 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65 20  s already where 
37f20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
37f30 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  nd returns witho
37f40 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e  ut.  ** doing an
37f50 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64  y work. To avoid
37f60 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73 65   thwarting these
37f70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20   optimizations, 
37f80 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a  it is important.
37f90 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61    ** not to clea
37fa0 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65 72  r the cursor her
37fb0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
37fc0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
37fd0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
37fe0 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66 28 20  t, pCur);.  if( 
37ff0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
38000 20 20 69 66 28 20 21 6c 6f 63 20 29 7b 0a 20 20    if( !loc ){.  
38010 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
38020 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
38030 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
38040 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20   &loc);.    if( 
38050 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
38060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
38070 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
38080 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43 75  OR_VALID || (pCu
38090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
380a0 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f 63  R_INVALID && loc
380b0 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  ) );..  pPage = 
380c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
380d0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
380e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
380f0 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
38100 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
38110 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
38120 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 54  ->intKey );..  T
38130 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
38140 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
38150 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
38160 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
38170 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
38180 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
38190 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
381a0 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
381b0 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
381c0 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
381d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
381e0 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
381f0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
38200 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
38210 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
38220 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
38230 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
38240 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
38250 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
38260 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
38270 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
38280 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
38290 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
382a0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
382b0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
382c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
382d0 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
382e0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
382f0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
38300 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75  ) );.  idx = pCu
38310 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
38320 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63  Page];.  if( loc
38330 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ==0 ){.    u16 s
38340 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
38350 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
38360 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
38370 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
38380 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
38390 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
383a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
383b0 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
383c0 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
383d0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
383e0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
383f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
38400 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
38410 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
38420 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
38430 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
38440 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
38450 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
38460 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
38470 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
38480 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 2c 20 26  e, idx, szOld, &
38490 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
384a0 29 20 67 6