/ Hex Artifact Content
Login

Artifact 80ea65224512884bb72976c93810d2dcaecc1353:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5690: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
56a0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
56b0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
56c0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
56d0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
56e0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
56f0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
5700: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
5710: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
5720: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
5730: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
5740: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5770: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5780: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5790: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
57a0: 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  dxKey);.  }else{
57b0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
57c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
57d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57e0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57f0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
5800: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
5810: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
5820: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
5830: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
5840: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
5850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5860: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
5870: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
5880: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
5890: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
58a0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
58b0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
58c0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
58d0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
58e0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
58f0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
5900: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
5910: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
5920: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
5930: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
5940: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
5950: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
5960: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5970: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5990: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
59a0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
59d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
59e0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59f0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5a00: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5a10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5a20: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
5a30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
5a40: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
5a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
5a60: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
5a70: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a80: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5a90: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
5aa0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ab0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5ac0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
5ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
5ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
5b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
5b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
5b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
5b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
5b70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5b80: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
5b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
5ba0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
5bb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5bc0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
5bd0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
5bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
5c00: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
5c10: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
5c20: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5c30: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5c40: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5c50: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5c60: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5c70: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5c80: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5c90: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5ca0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5cb0: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5cd0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
5ce0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
5cf0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
5d00: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
5d10: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
5d20: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5d30: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5d40: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5d60: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5d70: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5d80: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5d90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5da0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5db0: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5dc0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
5dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
5e00: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
5e10: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e  D || pCur->skipN
5e20: 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext!=0 ){.    *p
5e30: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5e50: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e70: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
5e80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5e90: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
5ea0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
5eb0: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
5ec0: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
5ed0: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
5ee0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
5ef0: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
5f00: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
5f10: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
5f20: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
5f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5f40: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
5f50: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
5f60: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
5f70: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
5f80: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
5f90: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
5fa0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
5fb0: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
5fc0: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
5fd0: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
5fe0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
5ff0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
6000: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6010: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
6020: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
6030: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
6040: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6050: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6060: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
6070: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
6080: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
6090: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
60a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
60b0: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
60c0: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
60d0: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
60e0: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
60f0: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
6100: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
6110: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
6120: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
6130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6140: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
6150: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
6160: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6180: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
6190: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
61a0: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
61b0: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
61c0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
61d0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
61e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
61f0: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
6200: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
6210: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
6220: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
6230: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6240: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
6250: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6260: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
6270: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
6280: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
6290: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
62a0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
62b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
62c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
62d0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
62e0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
62f0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6300: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6310: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
6320: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6330: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6340: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
6350: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
6360: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6370: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
6380: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6390: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
63a0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
63b0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
63c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
63d0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
63e0: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
63f0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
6400: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
6410: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6420: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6430: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
6440: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
6450: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
6460: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
6470: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
6480: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
6490: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
64a0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
64b0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
64c0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
64d0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
64e0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
64f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6500: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
6510: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
6520: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6530: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6550: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6560: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6570: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6580: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6590: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
65a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
65b0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
65c0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
65d0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
65e0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70  fset<0 ){.    *p
65f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6600: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
6610: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
6620: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6630: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6650: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
6660: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6670: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6680: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
6690: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
66a0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
66b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
66c0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
66d0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
66e0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
66f0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
6700: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
6710: 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74  *pRC= rc = sqlit
6720: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
6730: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
6740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6750: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
6760: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
6770: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
6780: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6790: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
67a0: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
67b0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
67c0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
67d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
67e0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
67f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
6800: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6810: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
6820: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6830: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6840: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6850: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6860: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6870: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6880: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6890: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
68a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
68b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
68c0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
68d0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
68e0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
68f0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
6900: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
6910: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
6920: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
6930: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6940: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6950: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6960: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6970: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6980: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6990: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
69a0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
69b0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
69c0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
69d0: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
69e0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
69f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
6a00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6a10: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6a20: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
6a30: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6a40: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6a60: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6a70: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6a80: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6a90: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6aa0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6ab0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6ac0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6ad0: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
6ae0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
6af0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
6b00: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
6b10: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
6b20: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6b30: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
6b40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6b50: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
6b60: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6b70: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6b80: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
6b90: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
6ba0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
6bb0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
6bc0: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
6bd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
6be0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6bf0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
6c00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6c10: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
6c20: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
6c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
6c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c60: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
6c70: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
6c80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
6c90: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
6ca0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
6cb0: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
6cc0: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
6cd0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6ce0: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
6cf0: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
6d00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
6d10: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
6d20: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
6d30: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
6d40: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
6d50: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
6d60: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
6d70: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
6d80: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
6d90: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
6da0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
6dc0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
6dd0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
6de0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
6df0: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
6e00: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
6e10: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
6e20: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
6e30: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
6e40: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
6e50: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
6e60: 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44  llv2(D,M,O,I) (D
6e70: 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28  +(M&get2byte(D+(
6e80: 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a  O+2*(I))))).../*
6e90: 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20  .** This a more 
6ea0: 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20  complex version 
6eb0: 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68  of findCell() th
6ec0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
6ed0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
6ee0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
6ef0: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
6f00: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
6f10: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
6f20: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
6f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
6f40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6f50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6f60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
6f70: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
6f80: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
6f90: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
6fa0: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
6fb0: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
6fc0: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
6fd0: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
6fe0: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
6ff0: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
7000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
7010: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
7020: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
7030: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
7040: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7050: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7060: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7070: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7080: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7090: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
70a0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
70b0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
70c0: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
70d0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
70e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
70f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7100: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7110: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7120: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7130: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7140: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7150: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7160: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7170: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7180: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
7190: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
71a0: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
71b0: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
71c0: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
71d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
71e0: 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f  lPtr(). Using so
71f0: 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68  me compilers, th
7200: 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65  is will be faste
7210: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
7220: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
7230: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
7240: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7250: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7260: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7270: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
7280: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
7290: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
72a0: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
72b0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
72c0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
72d0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
72e0: 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20  {.  u16 n;      
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7300: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
7310: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
7320: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
7330: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
7340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
7350: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
7360: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
7370: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7380: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
7390: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e  mutex) );..  pIn
73a0: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
73b0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
73c0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
73d0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
73e0: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
73f0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
7400: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
7410: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
7420: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
7430: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
7440: 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
7450: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
7460: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
7470: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65  Payload);.    }e
7480: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c  lse{.      nPayl
7490: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  oad = 0;.    }. 
74a0: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
74b0: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
74c0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
74d0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  ;.    pInfo->nDa
74e0: 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ta = nPayload;. 
74f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
7500: 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20  o->nData = 0;.  
7510: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7520: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7530: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e  ayload);.    pIn
7540: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
7550: 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  oad;.  }.  pInfo
7560: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
7570: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
7580: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74  nHeader = n;.  t
7590: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
75a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
75b0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
75c0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
75d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
75e0: 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50  .  if( likely(nP
75f0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
7600: 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  axLocal) ){.    
7610: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
7620: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
7630: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
7640: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
7650: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
7660: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
7670: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
7680: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
7690: 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f( (pInfo->nSize
76a0: 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c   = (u16)(n+nPayl
76b0: 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d  oad))<4 ) pInfo-
76c0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
76d0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
76e0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
76f0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
7700: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
7710: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
7720: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
7730: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
7740: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
7750: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
7760: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
7770: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
7780: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
7790: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
77a0: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
77b0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
77c0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
77d0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
77e0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
77f0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
7800: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
7810: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
7820: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
7830: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
7840: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
7850: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
7860: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
7870: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
7880: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
7890: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
78a0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
78b0: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
78c0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
78d0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
78e0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
78f0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
7900: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
7910: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
7920: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
7930: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
7940: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
7950: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
7960: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
7970: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
7980: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
7990: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
79a0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
79b0: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
79c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
79d0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
79e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
79f0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
7a00: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
7a10: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
7a20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7a30: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7a40: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7a50: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
7a60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
7a70: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
7a80: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
7a90: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
7aa0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
7ab0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
7ac0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
7ad0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
7ae0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
7af0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7b00: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
7b10: 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66  low = (u16)(pInf
7b20: 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a  o->nLocal + n);.
7b30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
7b40: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
7b50: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23  low + 4;.  }.}.#
7b60: 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c  define parseCell
7b70: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
7b80: 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50  Info) \.  btreeP
7b90: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
7ba0: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
7bb0: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
7bc0: 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63   (pInfo)).static
7bd0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
7be0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
7bf0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
7c00: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
7c10: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
7c20: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
7c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7c40: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
7c50: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
7c60: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
7c70: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
7c80: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
7c90: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
7ca0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
7cb0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
7cc0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
7cd0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
7ce0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
7cf0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
7d00: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
7d10: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
7d20: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
7d30: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
7d40: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
7d50: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
7d60: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
7d70: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
7d80: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
7d90: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
7da0: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
7db0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  er..*/.static u1
7dc0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
7dd0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
7de0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
7df0: 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70  pIter = &pCell[p
7e00: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
7e10: 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65  ze];.  u32 nSize
7e20: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
7e30: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
7e40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7e50: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
7e60: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
7e70: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
7e80: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
7e90: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
7ea0: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
7eb0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
7ec0: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
7ed0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
7ee0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
7ef0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
7f00: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
7f10: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
7f20: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
7f30: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
7f40: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
7f50: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
7f60: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7f70: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
7f80: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
7f90: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65  dif..  if( pPage
7fa0: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
7fb0: 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66  u8 *pEnd;.    if
7fc0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
7fd0: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20   ){.      pIter 
7fe0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7ff0: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
8000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
8010: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Size = 0;.    }.
8020: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
8030: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
8040: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
8050: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
8060: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
8070: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
8080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
8090: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
80a0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
80b0: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
80c0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
80d0: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
80e0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
80f0: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
8100: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
8110: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
8120: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8130: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
8140: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
8150: 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63  e);.  }..  testc
8160: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8170: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8180: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8190: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
81a0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
81b0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
81c0: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  al ){.    int mi
81d0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
81e0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
81f0: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
8200: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
8210: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
8220: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
8230: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
8240: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8250: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
8260: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8270: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8280: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
8290: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
82a0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
82b0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
82c0: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
82d0: 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65  = 4;.  }.  nSize
82e0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
82f0: 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  - pCell);..  /* 
8300: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  The minimum size
8310: 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20   of any cell is 
8320: 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66  4 bytes. */.  if
8330: 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20  ( nSize<4 ){.   
8340: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a   nSize = 4;.  }.
8350: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
8360: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
8370: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  e );.  return (u
8380: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  16)nSize;.}..#if
8390: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
83a0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
83b0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
83c0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
83d0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
83e0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
83f0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
8400: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
8410: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
8420: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  ell){.  return c
8430: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
8440: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
8450: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
8460: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
8470: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8480: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
8490: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
84a0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
84b0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
84c0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
84d0: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
84e0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
84f0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
8500: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
8510: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
8520: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
8530: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
8540: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
8550: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
8560: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
8570: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
8580: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
8590: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74  pCell!=0 );.  bt
85a0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
85b0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
85c0: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
85d0: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
85e0: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
85f0: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
8600: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
8610: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
8620: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
8630: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
8640: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
8650: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
8660: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
8670: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
8680: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
8690: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
86a0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
86b0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
86c0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
86d0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
86e0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
86f0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
8700: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
8710: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
8720: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
8730: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
8740: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
8750: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
8760: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
8770: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8780: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
8790: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
87a0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
87b0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
87e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
8810: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
8820: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8840: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
8850: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
8860: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
8870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
8880: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
8890: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
88b0: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
88c0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
88d0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
88e0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
88f0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
8900: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
8910: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
8920: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
8930: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8940: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8950: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
8960: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
8970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8980: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
8990: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
89a0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
89b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
89c0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
89d0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
89e0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
89f0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
8a00: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
8a10: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
8a20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
8a30: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
8a40: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
8a50: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
8a60: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
8a70: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
8a80: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
8a90: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
8aa0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
8ab0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
8ac0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
8ad0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8ae0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8af0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
8b00: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
8b10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8b20: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
8b30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8b50: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8b60: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
8b70: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
8b80: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
8b90: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
8ba0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
8bb0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8bc0: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
8bd0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
8be0: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
8bf0: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
8c00: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
8c10: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
8c20: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
8c30: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
8c40: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8c50: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  ize;.  cbrk = ge
8c60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8c70: 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
8c80: 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74  temp[cbrk], &dat
8c90: 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
8ca0: 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63  ize - cbrk);.  c
8cb0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
8cc0: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
8cd0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
8ce0: 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61  nCell;.  iCellLa
8cf0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
8d00: 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  - 4;.  for(i=0; 
8d10: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
8d20: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
8d30: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
8d40: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
8d50: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
8d60: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
8d70: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
8d80: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
8d90: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
8da0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
8db0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
8dc0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20  CellLast );.#if 
8dd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8de0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
8df0: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
8e00: 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69  /* These conditi
8e10: 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ons have already
8e20: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69   been verified i
8e30: 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  n btreeInitPage(
8e40: 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49  ).    ** if SQLI
8e50: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
8e60: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73  ZE_CELL_CHECK is
8e70: 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f   defined .    */
8e80: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
8e90: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
8ea0: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
8eb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8ec0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8ed0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
8ee0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
8ef0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
8f00: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
8f10: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
8f20: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
8f30: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
8f40: 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ze;.#if defined(
8f50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8f60: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8f70: 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  K).    if( cbrk<
8f80: 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
8f90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8fa0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8fb0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
8fc0: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
8fd0: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
8fe0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
8ff0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9000: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9010: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9020: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
9030: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
9040: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
9050: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
9060: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
9070: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
9080: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
9090: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
90a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
90b0: 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  a[cbrk], &temp[p
90c0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
90d0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
90e0: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
90f0: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
9100: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
9110: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9120: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
9130: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
9140: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
9150: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
9160: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
9170: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
9180: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
9190: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
91a0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
91b0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
91c0: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
91d0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
91e0: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
91f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9200: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9210: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9220: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
9230: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
9240: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
9250: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
9260: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
9270: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
9280: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
9290: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
92a0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
92b0: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
92c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
92d0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
92e0: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
92f0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
9300: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
9310: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
9320: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
9330: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
9340: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
9350: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
9360: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
9370: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
9380: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
9390: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
93a0: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
93b0: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
93c0: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
93d0: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
93e0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
93f0: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
9400: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
9410: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
9420: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
9430: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
9440: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
9450: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
9460: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
9470: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
9480: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
9490: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
94a0: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
94b0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
94c0: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
94d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
94e0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
94f0: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
9500: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
9510: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
9520: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
9530: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
9540: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
9550: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9560: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
9570: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
9580: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
9590: 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20  t nFrag;        
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
95c0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
95d0: 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69   on pPage */.  i
95e0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
9610: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
9620: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9630: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
9640: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
9650: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
9660: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
9670: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
9680: 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
9690: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
96a0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ode */.  int usa
96b0: 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62  bleSize; /* Usab
96c0: 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  le size of the p
96d0: 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  age */.  .  asse
96e0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
96f0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9700: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9710: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9720: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
9730: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9740: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9750: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9760: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
9770: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9780: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
9790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
97a0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
97b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
97c0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
97d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
97e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
97f0: 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
9800: 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53   nByte < usableS
9810: 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61  ize-8 );..  nFra
9820: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
9830: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9840: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9850: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9860: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9870: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9880: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9890: 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20  >nCell;.  top = 
98a0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
98b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
98c0: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
98d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
98e0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
98f0: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
9900: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9910: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
9920: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
9930: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
9940: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9950: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9960: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
9970: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
9980: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
9990: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
99a0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
99b0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
99c0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
99d0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
99e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b    }else if( gap+
99f0: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  2<=top ){.    /*
9a00: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
9a10: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
9a20: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
9a30: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
9a40: 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  fy .    ** the r
9a50: 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f  equest. The allo
9a60: 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66  cation is made f
9a70: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72  rom the first fr
9a80: 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20  ee slot in .    
9a90: 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  ** the list that
9aa0: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
9ab0: 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69   to accomadate i
9ac0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
9ad0: 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20  t pc, addr;.    
9ae0: 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20  for(addr=hdr+1; 
9af0: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
9b00: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20  data[addr]))>0; 
9b10: 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20  addr=pc){.      
9b20: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
9b30: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9b40: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
9b50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
9b60: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
9b70: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
9b80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b90: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a       }.      siz
9bb0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
9bc0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
9bd0: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
9be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9bf0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
9c00: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9c10: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
9c20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
9c30: 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =3 );.        if
9c40: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
9c50: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
9c60: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
9c70: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
9c80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
9c90: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67           ** frag
9ca0: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
9cb0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
9cc0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
9cd0: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
9ce0: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
9cf0: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
9d00: 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67  +7] = (u8)(nFrag
9d10: 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d   + x);.        }
9d20: 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63  else if( size+pc
9d30: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
9d40: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
9d50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d60: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
9d70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9d80: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
9d90: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
9da0: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
9db0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
9dc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  .          ** fo
9dd0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
9de0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
9df0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
9e00: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
9e10: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  &data[pc+2], x);
9e20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9e30: 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20     *pIdx = pc + 
9e40: 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  x;.        retur
9e50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
9e60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
9e70: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    /* Check to ma
9e80: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
9e90: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e   enough space in
9ea0: 20 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69   the gap to sati
9eb0: 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  sfy.  ** the all
9ec0: 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74  ocation.  If not
9ed0: 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20  , defragment..  
9ee0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
9ef0: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
9f00: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
9f10: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
9f20: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
9f30: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9f40: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9f50: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
9f60: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9f70: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
9f80: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
9f90: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
9fa0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
9fb0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
9fc0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
9fd0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9fe0: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
9ff0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
a000: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
a010: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
a020: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
a030: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
a040: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
a050: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
a060: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
a070: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
a080: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
a090: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
a0a0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
a0b0: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
a0c0: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
a0d0: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
a0e0: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
a0f0: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
a100: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
a110: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
a120: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
a130: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
a140: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a150: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
a160: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
a170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a180: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
a190: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
a1a0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
a1b0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
a1c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a1d0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
a1e0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
a1f0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
a200: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
a210: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
a220: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
a230: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
a240: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
a250: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
a260: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
a270: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
a280: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
a290: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
a2a0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
a2b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a2c0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
a2d0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
a2e0: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
a2f0: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
a320: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
a330: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
a340: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
a350: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a370: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a380: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
a390: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a3a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a3b0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
a3c0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
a3d0: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
a3e0: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
a3f0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
a400: 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  ze) <= (int)pPag
a410: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a420: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
a430: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a440: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
a450: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
a460: 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20  t( size>=0 );   
a470: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
a480: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20  size is 4 */..  
a490: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
a4a0: 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
a4b0: 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
a4c0: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
a4d0: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
a4e0: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
a4f0: 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70  delete.    ** op
a500: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
a510: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  */.    memset(&d
a520: 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73  ata[start], 0, s
a530: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
a540: 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61  Add the space ba
a550: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ck into the link
a560: 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  ed list of freeb
a570: 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61  locks.  Note tha
a580: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75  t.  ** even thou
a590: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
a5a0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
a5b0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
a5c0: 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65  ge(),.  ** btree
a5d0: 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20 6e  InitPage() did n
a5e0: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
a5f0: 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20  pping cells or. 
a600: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74   ** freeblocks t
a610: 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63  hat overlapped c
a620: 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73  ells.   Nor does
a630: 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e 20   it detect when 
a640: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f  the.  ** cell co
a650: 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65 65  ntent area excee
a660: 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ds the value in 
a670: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  the page header.
a680: 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20    If these.  ** 
a690: 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65  situations arise
a6a0: 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
a6b0: 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  t insert operati
a6c0: 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70  ons might corrup
a6d0: 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c  t.  ** the freel
a6e0: 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  ist.  So we do n
a6f0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72  eed to check for
a700: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c   corruption whil
a710: 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20  e scanning.  ** 
a720: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
a730: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
a740: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
a750: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a760: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
a770: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a780: 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73  - 4;.  assert( s
a790: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20  tart<=iLast );. 
a7a0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a7b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a7c0: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
a7d0: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
a7e0: 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64    if( pbegin<add
a7f0: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  r+4 ){.      ret
a800: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a810: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
a820: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a830: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67  ;.  }.  if( pbeg
a840: 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  in>iLast ){.    
a850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a860: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
a870: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
a880: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
a890: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
a8a0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
a8b0: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
a8c0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
a8d0: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
a8e0: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
a8f0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
a900: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
a910: 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73  ->nFree + (u16)s
a920: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
a930: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
a940: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
a950: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
a960: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
a970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a980: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
a990: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
a9a0: 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74  e, x;.    assert
a9b0: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
a9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
a9d0: 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  gin <= (int)pPag
a9e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a9f0: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
aa00: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
aa10: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
aa20: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
aa30: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
aa40: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
aa50: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
aa60: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
aa70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
aa80: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
aa90: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
aaa0: 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30       if( (frag<0
aab0: 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29  ) || (frag>(int)
aac0: 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a  data[hdr+7]) ){.
aad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
aae0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
aaf0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
ab00: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
ab10: 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20   (u8)frag;.     
ab20: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
ab30: 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20  ata[pnext]);.   
ab40: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ab50: 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20  a[pbegin], x);. 
ab60: 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b       x = pnext +
ab70: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab80: 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67  pnext+2]) - pbeg
ab90: 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  in;.      put2by
aba0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
abb0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73  2], x);.    }els
abc0: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  e{.      addr = 
abd0: 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  pbegin;.    }.  
abe0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
abf0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ac00: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66   begins with a f
ac10: 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65  reeblock, remove
ac20: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61   it. */.  if( da
ac30: 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b  ta[hdr+1]==data[
ac40: 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68  hdr+5] && data[h
ac50: 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+2]==data[hdr+
ac60: 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f  6] ){.    int to
ac70: 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20  p;.    pbegin = 
ac80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
ac90: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+1]);.    memc
aca0: 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  py(&data[hdr+1],
acb0: 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20   &data[pbegin], 
acc0: 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  2);.    top = ge
acd0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ace0: 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28  +5]) + get2byte(
acf0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ad00: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ad10: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
ad20: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
ad30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ad40: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
ad50: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
ad60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ad70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
ad80: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
ad90: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
ada0: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
adb0: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
adc0: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
add0: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
ade0: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
adf0: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
ae00: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
ae10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
ae20: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
ae30: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
ae40: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ae50: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
ae60: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
ae70: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
ae80: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
ae90: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
aea0: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
aeb0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
aec0: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
aed0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
aee0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
aef0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
af00: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
af10: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
af20: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
af30: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
af40: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
af50: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
af60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
af70: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
af80: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
af90: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
afa0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
afb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
afc0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
afd0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
afe0: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
aff0: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
b000: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
b010: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
b020: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
b030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b040: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
b050: 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  af;.  pBt = pPag
b060: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
b070: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
b080: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b090: 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  EY) ){.    pPage
b0a0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
b0b0: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
b0c0: 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   = pPage->leaf;.
b0d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b0e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
b0f0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
b100: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
b110: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
b120: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
b130: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
b140: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b150: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
b160: 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  hasData = 0;.   
b170: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b180: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
b190: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b1a0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b1b0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
b1c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b1d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b1e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b1f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b200: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b210: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
b220: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
b230: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
b240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
b250: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
b260: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
b270: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
b280: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
b290: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
b2a0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
b2b0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
b2c0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
b2d0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b2e0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
b2f0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
b300: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
b310: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
b320: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
b330: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
b340: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
b350: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
b360: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
b370: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
b380: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
b390: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
b3a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b3b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b3c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b3e0: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
b3f0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
b400: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b420: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
b430: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
b440: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
b460: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
b470: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
b480: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
b490: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
b4a0: 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70  nit ){.    u16 p
b4b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
b4c0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
b4d0: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
b4e0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
b4f0: 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20  .    u8 hdr;    
b500: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b510: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
b520: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
b530: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
b540: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
b550: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
b560: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
b570: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
b580: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
b590: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
b5a0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
b5b0: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b5c0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
b5d0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b5e0: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
b5f0: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
b600: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
b610: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
b620: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
b630: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
b640: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
b650: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
b660: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
b670: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
b680: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
b690: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
b6a0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20  ent area */.    
b6b0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
b6c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
b6d0: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
b6e0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b6f0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  /.    int iCellL
b700: 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
b710: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
b720: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
b730: 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  et */..    pBt =
b740: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
b750: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b760: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
b770: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b780: 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  a;.    if( decod
b790: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
b7a0: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
b7b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b7c0: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
b7d0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
b7e0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
b7f0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
b800: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
b810: 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
b820: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
b830: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
b840: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
b850: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
b860: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
b870: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b880: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
b890: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
b8a0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b8b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
b8c0: 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
b8d0: 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze];.    pPage->
b8e0: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
b8f0: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
b900: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b910: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b920: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65  r+5]);.    pPage
b930: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
b940: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b950: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
b960: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
b970: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
b980: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
b990: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
b9a0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
b9b0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
b9c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b9d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b9e0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
b9f0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
ba00: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
ba10: 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  ;..    /* A malf
ba20: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
ba30: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
ba40: 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
ba50: 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f  the end.    ** o
ba60: 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
ba70: 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
ba80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
ba90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
baa0: 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
bab0: 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
bac0: 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
bad0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bae0: 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
baf0: 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
bb00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
bb10: 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74  o be .    ** ret
bb20: 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
bb30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65  ..    */.    iCe
bb40: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bb50: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
bb60: 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c  nCell;.    iCell
bb70: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
bb80: 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e  e - 4;.#if defin
bb90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
bba0: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
bbb0: 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20  HECK).    {.    
bbc0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
bbd0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
bbe0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bbf0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
bc00: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
bc10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
bc20: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
bc30: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bc40: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
bc50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bc60: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
bc70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
bc80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bc90: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
bca0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
bcb0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
bcc0: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  rst );.        t
bcd0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bce0: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
bcf0: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bd00: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bd10: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
bd20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bd30: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bd40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
bd50: 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
bd60: 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
bd70: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
bd80: 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62  ase( pc+sz==usab
bd90: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
bda0: 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62    if( pc+sz>usab
bdb0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bdd0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bde0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bdf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
be00: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
be10: 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a  Last++;.    }  .
be20: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
be30: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
be40: 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74   free space on t
be50: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70  he page */.    p
be60: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
be70: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
be80: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
be90: 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77  +7] + top;.    w
bea0: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
beb0: 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69      u16 next, si
bec0: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63  ze;.      if( pc
bed0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bee0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bef0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
bf00: 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  of free block is
bf10: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
bf20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bf30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bf40: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
bf50: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
bf60: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
bf70: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
bf80: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
bf90: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  ]);.      if( (n
bfa0: 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
bfb0: 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b  c+size+3) || pc+
bfc0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
bfd0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
bfe0: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
bff0: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
c000: 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61  rder. And the la
c010: 73 74 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74  st byte of..** t
c020: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
c030: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
c040: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
c050: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c060: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c070: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
c080: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
c090: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
c0a0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
c0b0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
c0c0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
c0d0: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
c0e0: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
c0f0: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
c100: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
c110: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
c120: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
c130: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
c140: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
c150: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
c160: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
c170: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
c180: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
c190: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
c1a0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
c1b0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
c1c0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
c1d0: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
c1e0: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
c1f0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
c200: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
c210: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
c220: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
c230: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
c240: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
c250: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
c260: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
c270: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
c280: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c290: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
c2a0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
c2b0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
c2c0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
c2d0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c2e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
c2f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c300: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
c310: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
c320: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
c330: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
c340: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
c350: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
c360: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
c370: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
c380: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
c390: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
c3a0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
c3b0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c3c0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
c3d0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
c3e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
c3f0: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
c400: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
c410: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
c420: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
c430: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
c440: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c450: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
c460: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
c470: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
c480: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c490: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
c4a0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
c4b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c4c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c4d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c4e0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
c4f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c500: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
c510: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
c520: 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
c530: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
c540: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
c550: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
c560: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
c570: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
c580: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
c590: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
c5a0: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30  TF_LEAF)==0 ?1:0
c5b0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
c5c0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
c5d0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c5e0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
c5f0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
c600: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
c610: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c620: 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
c630: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
c640: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
c650: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
c660: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c670: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
c680: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
c690: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
c6a0: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
c6b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
c6c0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
c6d0: 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
c6e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
c6f0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
c700: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
c710: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
c720: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
c730: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
c740: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
c750: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
c760: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c770: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c780: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
c790: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
c7a0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
c7b0: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
c7c0: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
c7d0: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
c7e0: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
c7f0: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c800: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
c810: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
c820: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
c830: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
c840: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
c850: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
c860: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c870: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c880: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c890: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c8a0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c8b0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c8c0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c8d0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c8e0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c8f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c900: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c910: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
c920: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
c930: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
c940: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
c950: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
c960: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
c970: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
c980: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
c990: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c9a0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
c9b0: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
c9c0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
c9d0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
c9e0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
c9f0: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
ca00: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
ca10: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
ca20: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
ca30: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
ca40: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
ca50: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
ca60: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
ca70: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
ca80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
ca90: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
caa0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
cab0: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
cac0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
cad0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
cae0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
caf0: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
cb00: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
cb10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
cb20: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
cb30: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
cb40: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
cb50: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cb70: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
cb80: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
cb90: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
cba0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
cbb0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
cbc0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
cbd0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
cbe0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
cbf0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
cc00: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
cc10: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
cc20: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
cc30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cc40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
cc50: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
cc60: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
cc70: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
cc80: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
cc90: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
cca0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
ccb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
ccc0: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
ccd0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cce0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
ccf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
cd10: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
cd20: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
cd30: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
cd40: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
cd50: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
cd60: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
cd70: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
cd80: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
cd90: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
cda0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
cdb0: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
cdc0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
cdd0: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
cde0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
cdf0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
ce00: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
ce10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ce20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
ce30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
ce40: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
ce50: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
ce60: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ce70: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
ce80: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
ce90: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
cea0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ceb0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cec0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ced0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
cee0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cef0: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
cf00: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
cf10: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
cf20: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
cf30: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
cf40: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
cf50: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
cf60: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
cf70: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
cf80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
cf90: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
cfa0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cfb0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
cfc0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
cfd0: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
cfe0: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
cff0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d000: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d010: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d020: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d030: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d040: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d060: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d070: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d080: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d090: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d0a0: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d0b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d0c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d0d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d0e0: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d0f0: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d100: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d110: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d120: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d130: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d140: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d150: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d160: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d170: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d180: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
d190: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
d1a0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
d1b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d1c0: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
d1d0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
d1e0: 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74  Page     /* Writ
d1f0: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
d200: 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  er here */.){.  
d210: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
d220: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d230: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d240: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
d250: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d260: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
d270: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d280: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
d290: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
d2a0: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
d2b0: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
d2c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d2d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
d2e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
d2f0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
d300: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d310: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
d320: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d340: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  }..  testcase( p
d350: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
d360: 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
d370: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
d380: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
d390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
d3a0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
d3b0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
d3c0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
d3d0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
d3e0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
d3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d400: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
d410: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
d420: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
d430: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d440: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
d450: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
d460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d470: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d480: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
d490: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
d4a0: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
d4b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d4c0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
d4d0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
d4e0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
d4f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d500: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
d520: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
d530: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
d540: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
d550: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
d560: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
d570: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
d580: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
d590: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
d5a0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
d5b0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
d5c0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
d5d0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d5e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
d5f0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
d600: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
d610: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d620: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d630: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
d640: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
d650: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
d660: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
d670: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
d680: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
d690: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d6a0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
d6b0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
d6c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
d6d0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
d6e0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
d6f0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
d700: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d710: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
d720: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
d730: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
d740: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
d750: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d760: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d770: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
d780: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
d790: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
d7a0: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
d7b0: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
d7c0: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
d7d0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
d7e0: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
d7f0: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
d800: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
d810: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
d820: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
d830: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
d840: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
d850: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
d860: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d870: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
d880: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d890: 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
d8a0: 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
d8b0: 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
d8c0: 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
d8d0: 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
d8e0: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
d8f0: 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
d900: 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
d910: 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
d920: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
d930: 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
d940: 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
d950: 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
d960: 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
d970: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
d980: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
d990: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
d9a0: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
d9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
d9c0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
d9d0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
d9e0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
d9f0: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
da00: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
da10: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
da20: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
da30: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
da40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
da50: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
da60: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
da70: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
da80: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
da90: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
daa0: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
dab0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
dac0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
dad0: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
dae0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
daf0: 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
db00: 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
db10: 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
db20: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
db30: 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
db40: 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
db50: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
db60: 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
db70: 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
db80: 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
db90: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
dba0: 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
dbb0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
dbc0: 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
dbd0: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
dbe0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
dbf0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
dc00: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
dc10: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
dc20: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
dc30: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
dc40: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
dc50: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
dc60: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
dc70: 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
dc80: 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
dc90: 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
dca0: 6e 20 62 69 74 73 0a 2a 2a 20 42 54 52 45 45 5f  n bits.** BTREE_
dcb0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
dcc0: 2f 6f 72 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41  /or BTREE_NO_REA
dcd0: 44 4c 4f 43 4b 2e 20 20 54 68 65 20 42 54 52 45  DLOCK.  The BTRE
dce0: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a  E_NO_READLOCK.**
dcf0: 20 62 69 74 20 69 73 20 61 6c 73 6f 20 73 65 74   bit is also set
dd00: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4e   if the SQLITE_N
dd10: 6f 52 65 61 64 6c 6f 63 6b 20 66 6c 61 67 73 20  oReadlock flags 
dd20: 69 73 20 73 65 74 20 69 6e 20 64 62 2d 3e 66 6c  is set in db->fl
dd30: 61 67 73 2e 0a 2a 2a 20 54 68 65 73 65 20 66 6c  ags..** These fl
dd40: 61 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74  ags are passed t
dd50: 68 72 6f 75 67 68 20 69 6e 74 6f 20 73 71 6c 69  hrough into sqli
dd60: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 29 20 61  te3PagerOpen() a
dd70: 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  nd must.** be th
dd80: 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 61 73  e same values as
dd90: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
dda0: 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f  NAL and PAGER_NO
ddb0: 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  _READLOCK..**.**
ddc0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
ddd0: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
dde0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
ddf0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
de00: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
de10: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
de20: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
de30: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
de40: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
de50: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
de60: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
de70: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
de80: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
de90: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
dea0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
deb0: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
dec0: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
ded0: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
dee0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
def0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
df00: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
df10: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
df20: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
df30: 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
df40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
df50: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
df60: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
df70: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
df80: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
df90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
dfa0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
dfb0: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
dfc0: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
dfd0: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
dfe0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
dff0: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
e000: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
e010: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
e020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
e030: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
e040: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
e050: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
e060: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
e070: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
e080: 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
e090: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
e0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
e0b0: 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
e0c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
e0d0: 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e0f0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
e100: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
e110: 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
e120: 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
e130: 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
e140: 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
e150: 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
e160: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e170: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
e180: 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
e190: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
e1a0: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e1c0: 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
e1d0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
e1e0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
e1f0: 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
e200: 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
e210: 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
e220: 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
e230: 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
e240: 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
e250: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
e260: 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
e270: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
e280: 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
e290: 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
e2a0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
e2b0: 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
e2c0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e2d0: 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
e2e0: 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
e2f0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
e300: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
e310: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
e320: 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
e330: 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
e340: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
e350: 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
e360: 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
e370: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
e380: 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
e3a0: 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
e3b0: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
e3c0: 79 28 64 62 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  y(db));.#endif..
e3d0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
e3e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
e3f0: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
e400: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e410: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
e430: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
e440: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
e450: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
e460: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
e470: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e480: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
e490: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
e4a0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e4b0: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e4c0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
e4d0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
e4e0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
e4f0: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e500: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
e510: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
e520: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
e530: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e540: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
e550: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
e560: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
e570: 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c  & SQLITE_NoReadl
e580: 6f 63 6b 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  ock ){.    flags
e590: 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41   |= BTREE_NO_REA
e5a0: 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  DLOCK;.  }.  if(
e5b0: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
e5c0: 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
e5d0: 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
e5e0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
e5f0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
e600: 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
e610: 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
e620: 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
e630: 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
e640: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
e650: 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
e660: 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
e670: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e680: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
e690: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
e6a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e6b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e6c0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
e6d0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
e6e0: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
e6f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
e700: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
e710: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
e720: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
e730: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
e740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e750: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e760: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
e770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e780: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
e790: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
e7a0: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
e7b0: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
e7c0: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
e7d0: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
e7e0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
e7f0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
e800: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
e810: 64 62 3d 3d 30 20 26 26 20 69 73 54 65 6d 70 44  db==0 && isTempD
e820: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
e830: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
e840: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
e850: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
e860: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
e870: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
e880: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
e890: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e8a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
e8b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e8c0: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
e8d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e8e0: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
e8f0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e910: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
e920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e930: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e950: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
e960: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e970: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e980: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e990: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e9a0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e9b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
e9c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e9d0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
e9e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
e9f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
ea00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
ea10: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  ;.      }.#if SQ
ea20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
ea30: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
ea40: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ea50: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ea60: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
ea70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ea80: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
ea90: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
eaa0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
eab0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
eac0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
ead0: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
eae0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eaf0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
eb00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
eb10: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
eb20: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
eb30: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
eb40: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
eb50: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
eb60: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
eb70: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
eb80: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
eb90: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
eba0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
ebb0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
ebd0: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
ebe0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
ebf0: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
ec00: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
ec10: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
ec20: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
ec30: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
ec40: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
ec50: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
ec60: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
ec70: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
ec80: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
ec90: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
eca0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ecb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
ecc0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
ecd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ece0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
ecf0: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
ed00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ed10: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
ed20: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
ed30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ed40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ed50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ed60: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
ed70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
ed90: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
eda0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
edb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
edc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ede0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
edf0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
ee00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ee10: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
ee20: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
ee30: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
ee40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
ee50: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
ee60: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
ee70: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
ee80: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
ee90: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
eea0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
eeb0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
eec0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
eed0: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
eee0: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
eef0: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
ef00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ef10: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
ef20: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
ef30: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
ef40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ef50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
ef60: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ef70: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
ef80: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
ef90: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
efa0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
efb0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
efc0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
efd0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
efe0: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
eff0: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
f000: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
f010: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
f020: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
f030: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
f040: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
f050: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
f060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f070: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
f080: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
f090: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f0a0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
f0b0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
f0c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f0d0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
f0e0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
f0f0: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
f100: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f110: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
f120: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
f130: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
f140: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
f150: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
f160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f170: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
f180: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
f1a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
f1b0: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
f1c0: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
f1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f1e0: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
f1f0: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
f200: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
f210: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
f220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f240: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
f250: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
f260: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
f270: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
f280: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
f290: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f2a0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
f2b0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
f2c0: 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
f2d0: 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
f2e0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f300: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
f310: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
f320: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
f330: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
f340: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
f350: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
f360: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
f370: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
f380: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
f390: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
f3a0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
f3b0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f3c0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
f3d0: 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65     pBt->secureDe
f3e0: 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  lete = 1;.#endif
f3f0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
f400: 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b  ze = (zDbHeader[
f410: 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65  16]<<8) | (zDbHe
f420: 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  ader[17]<<16);. 
f430: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
f440: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
f450: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
f460: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
f470: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
f480: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
f490: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
f4a0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
f4b0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
f4c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f4d0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
f4e0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
f4f0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
f500: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
f510: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f520: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
f530: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
f540: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
f550: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
f560: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
f570: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
f580: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
f590: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
f5a0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
f5b0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
f5c0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
f5d0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
f5e0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
f5f0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
f600: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
f610: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
f620: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
f630: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
f640: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
f650: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
f660: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
f670: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
f680: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
f690: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
f6a0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
f6b0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
f6c0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
f6d0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
f6e0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
f6f0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
f700: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
f710: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
f720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
f730: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
f740: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
f750: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
f760: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
f770: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f780: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
f790: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
f7a0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f7b0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
f7c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
f7d0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
f7e0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
f7f0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
f800: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
f810: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f820: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
f830: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
f840: 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
f850: 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
f860: 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
f870: 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
f880: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
f890: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
f8a0: 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
f8b0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
f8c0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
f8d0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
f8e0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
f8f0: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
f900: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
f910: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
f920: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f930: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
f940: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
f950: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
f960: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
f970: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
f980: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
f990: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
f9a0: 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
f9b0: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
f9c0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
f9d0: 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e  d; ).      pBt->
f9e0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
f9f0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
fa00: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
fa10: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
fa20: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
fa30: 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
fa40: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
fa50: 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
fa60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
fa70: 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
fa80: 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
fa90: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
faa0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
fab0: 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
fac0: 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
fad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
fae0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
faf0: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
fb00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
fb10: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
fb20: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
fb30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb40: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
fb50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
fb60: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
fb70: 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
fb80: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
fb90: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
fba0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
fbb0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
fbc0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
fbd0: 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
fbe0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
fbf0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
fc00: 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
fc10: 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
fc20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fc30: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
fc40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fc50: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
fc60: 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
fc70: 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
fc80: 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
fc90: 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
fca0: 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
fcb0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
fcc0: 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
fcd0: 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
fce0: 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
fcf0: 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
fd00: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
fd10: 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
fd20: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
fd30: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
fd40: 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
fd50: 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
fd60: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
fd70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
fd80: 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
fd90: 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
fda0: 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
fdb0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
fdc0: 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
fdd0: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
fde0: 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
fdf0: 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
fe00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
fe10: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
fe20: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
fe30: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
fe40: 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
fe50: 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
fe60: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
fe70: 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
fe80: 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
fe90: 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
fea0: 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
feb0: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
fec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fed0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
fee0: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
fef0: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
ff00: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
ff10: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
ff30: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
ff40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ff50: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
ff60: 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
ff70: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
ff80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ff90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
ffa0: 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
ffb0: 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
ffc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ffd0: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
ffe0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
fff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
10000 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
10010 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
10020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
10030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10040 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
10050 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
10060 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
10070 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
10080 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
10090 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
100a0 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
100b0 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
100c0 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
100d0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
100e0 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
100f0 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
10100 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
10110 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
10120 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
10130 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10140 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
10150 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
10160 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10170 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
10180 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
10190 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
101a0 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IZE);.    }.  }.
101b0 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
101c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
101d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
101e0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
101f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10200 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
10210 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
10220 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
10230 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
10240 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
10250 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
10260 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
10270 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
10280 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
10290 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
102a0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
102b0 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
102c0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
102d0 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
102e0 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
102f0 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
10300 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
10310 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
10320 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
10330 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
10340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10350 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
10360 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
10370 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
10380 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
10390 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
103a0 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
103b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
103c0 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
103d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
103e0 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
103f0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
10400 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10410 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
10420 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
10430 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
10440 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
10450 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
10460 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
10470 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
10480 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
10490 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
104a0 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
104b0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
104c0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
104d0 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
104e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
104f0 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
10500 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
10510 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
10520 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
10530 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
10540 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
10550 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
10560 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
10570 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
10580 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
10590 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
105a0 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
105b0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
105c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
105d0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
105e0 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
105f0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
10600 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
10610 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
10620 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10630 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
10640 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
10650 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
10660 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
10670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
10680 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
10690 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
106a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
106b0 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
106c0 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  Bt) bytes..*/.st
106d0 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
106e0 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
106f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
10700 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
10710 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
10720 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
10730 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
10740 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
10750 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
10760 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
10770 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
10780 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
10790 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
107a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
107b0 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42  ite3PageFree( pB
107c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
107d0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
107e0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
107f0 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
10800 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
10810 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
10820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10830 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
10840 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
10850 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10860 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
10870 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
10880 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
10890 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
108a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
108b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
108c0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
108d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
108e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
108f0 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
10900 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
10910 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
10920 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
10930 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
10940 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
10950 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
10960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
10970 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
10980 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
10990 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
109a0 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
109b0 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
109c0 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
109d0 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
109e0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
109f0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
10a00 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
10a10 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
10a20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
10a30 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
10a40 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
10a50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10a60 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
10a70 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
10a80 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
10a90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
10aa0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
10ab0 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
10ac0 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
10ad0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
10ae0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
10af0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
10b00 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
10b10 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
10b20 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
10b30 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
10b40 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
10b50 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
10b60 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
10b70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
10b80 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
10b90 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
10ba0 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
10bb0 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
10bc0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
10bd0 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
10be0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
10bf0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
10c00 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
10c10 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
10c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
10c30 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
10c40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
10c50 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
10c60 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
10c70 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
10c80 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
10c90 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
10ca0 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
10cb0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
10cc0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
10cd0 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
10ce0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
10cf0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
10d00 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
10d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10d20 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
10d30 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
10d40 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
10d50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
10d60 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
10d70 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
10d80 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
10d90 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
10da0 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
10db0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
10dc0 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
10dd0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10df0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
10e00 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
10e10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
10e20 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
10e30 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
10e40 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
10e50 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
10e60 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
10e70 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
10e80 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
10e90 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
10ea0 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
10eb0 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
10ec0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
10ed0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
10ee0 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
10ef0 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
10f00 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
10f10 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
10f20 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
10f30 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
10f40 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
10f50 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
10f60 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
10f70 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
10f80 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
10f90 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
10fa0 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
10fb0 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
10fc0 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
10fd0 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
10fe0 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
10ff0 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
11000 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
11010 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
11020 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
11030 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
11040 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
11050 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
11060 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
11070 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
11080 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
11090 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
110a0 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
110b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
110c0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
110d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
110e0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
110f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
11120 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
11130 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11140 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
11150 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
11160 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
11170 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
11180 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
111a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
111b0 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
111c0 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
111d0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
111e0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
111f0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
11200 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
11210 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
11220 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
11230 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
11240 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
11250 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
11260 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
11270 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
11280 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
11290 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
112a0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
112b0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
112c0 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
112d0 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
112e0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
112f0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
11300 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
11310 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
11320 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
11330 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
11340 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
11350 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
11360 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11370 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
11380 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
11390 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
113a0 76 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  vel(.  Btree *p,
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113c0 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
113d0 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
113e0 65 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  el on */.  int l
113f0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
11400 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
11410 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
11420 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
11430 4c 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53  L */.  int fullS
11440 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ync,          /*
11450 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
11460 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74  c. */.  int ckpt
11470 46 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f  FullSync       /
11480 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  * PRAGMA checkpo
11490 69 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a  int_fullfync */.
114a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
114b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
114c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
114d0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
114e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
114f0 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26  ert( level>=1 &&
11500 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73   level<=3 );.  s
11510 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11520 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
11530 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
11540 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
11550 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20  evel, fullSync, 
11560 63 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20  ckptFullSync);. 
11570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11580 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
115a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
115b0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
115c0 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
115d0 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
115e0 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
115f0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
11600 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
11610 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
11620 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
11630 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
11640 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
11650 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
11660 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11670 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
11680 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11690 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
116a0 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
116b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
116c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
116d0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
116e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
116f0 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
11700 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
11710 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11720 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11730 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11740 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
11750 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
11760 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
11770 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
11780 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
11790 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
117a0 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
117b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
117c0 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
117d0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
117e0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
117f0 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
11800 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
11810 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
11820 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
11830 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
11840 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
11850 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
11860 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
11870 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
11880 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
11890 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
118a0 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
118b0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
118c0 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
118d0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
118e0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
118f0 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
11900 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
11910 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
11920 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
11930 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
11940 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
11950 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
11960 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
11970 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
11980 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
11990 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
119a0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
119b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
119c0 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
119d0 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
119e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
119f0 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
11a00 68 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65  hen the pageSize
11a10 46 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65  Fixed flag is se
11a20 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
11a30 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
11a40 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
11a50 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
11a60 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
11a70 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
11a80 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
11a90 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
11aa0 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
11ab0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
11ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11ae0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11af0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
11b00 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
11b10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
11b20 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
11b30 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
11b40 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ixed ){.    sqli
11b50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11b60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11b70 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
11b80 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
11b90 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
11ba0 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
11bb0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
11bc0 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
11bd0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
11be0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
11bf0 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
11c00 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
11c10 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
11c20 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
11c30 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
11c40 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
11c50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
11c60 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
11c70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11c80 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
11c90 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
11ca0 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
11cb0 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
11cc0 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
11cd0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
11ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11cf0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
11d00 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
11d10 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
11d20 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
11d30 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
11d40 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
11d50 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
11d60 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65  iFix ) pBt->page
11d70 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20  SizeFixed = 1;. 
11d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11d90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11da0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11db0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
11dc0 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
11dd0 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
11de0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
11df0 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
11e00 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
11e10 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20  ageSize;.}..#if 
11e20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11e30 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
11e40 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
11e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
11e60 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UM)./*.** Return
11e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
11e80 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
11e90 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
11ea0 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
11eb0 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
11ec0 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
11ed0 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
11ee0 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
11ef0 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
11f00 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
11f10 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11f20 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
11f30 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
11f40 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
11f50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
11f60 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
11f70 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
11f80 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
11f90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11fa0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
11fb0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
11fc0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
11fd0 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
11fe0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
11ff0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
12000 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
12010 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
12020 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
12030 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
12040 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
12050 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
12060 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
12070 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12080 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
12090 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
120a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
120b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
120c0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
120d0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
120e0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
120f0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
12100 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12110 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12120 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
12130 20 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74   the secureDelet
12140 65 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  e flag if newFla
12150 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
12160 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
12170 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
12180 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
12190 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
121a0 65 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44  e of the secureD
121b0 65 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67  elete.** setting
121c0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
121d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
121e0 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
121f0 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
12200 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
12210 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
12220 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
12230 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12240 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
12250 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
12260 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
12270 3d 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f  = (newFlag!=0) ?
12280 20 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62   1 : 0;.  } .  b
12290 20 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72   = p->pBt->secur
122a0 65 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74  eDelete;.  sqlit
122b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
122c0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23  .  return b;.}.#
122d0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
122e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
122f0 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
12300 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12310 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
12320 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
12330 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
12340 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
12350 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
12360 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
12370 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
12380 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
12390 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
123a0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
123b0 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
123c0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
123d0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
123e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
123f0 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
12400 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
12410 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
12420 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
12430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12440 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
12450 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
12460 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
12470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12480 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
12490 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
124a0 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
124b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
124c0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
124d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
124e0 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
124f0 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
12500 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
12510 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
12520 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30  ixed && (av ?1:0
12530 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
12540 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
12550 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
12570 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
12580 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
12590 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
125a0 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
125b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
125c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
125d0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
125e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
125f0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
12600 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
12610 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
12620 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
12630 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
12640 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
12650 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12660 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
12670 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
12680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12690 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
126a0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
126b0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
126c0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
126d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
126e0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
126f0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
12700 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12710 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
12720 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
12730 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12740 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
12750 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
12760 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
12770 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
12790 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
127a0 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
127b0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
127c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
127d0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
127e0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
127f0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
12800 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
12810 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
12820 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
12830 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
12840 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
12850 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
12860 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
12870 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
12880 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
12890 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
128a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
128b0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
128c0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
128d0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
128e0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
128f0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
12900 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
12910 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
12920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12930 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12940 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
12950 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12960 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
12970 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12980 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
12990 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
129a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
129b0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
129c0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
129d0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
129e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
129f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12a00 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12a10 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
12a20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12a30 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12a40 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
12a50 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
12a60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12a70 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
12a90 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
12aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12ab0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
12ac0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
12ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
12af0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12b00 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
12b10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
12b20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
12b30 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
12b40 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
12b50 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
12b60 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
12b70 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
12b80 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
12b90 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
12ba0 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
12bb0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
12bc0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12bd0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
12be0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12bf0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
12c00 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
12c10 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
12c20 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
12c30 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
12c40 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
12c50 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
12c60 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
12c70 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
12c80 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
12c90 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
12ca0 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
12cb0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
12cc0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
12cd0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
12ce0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
12cf0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
12d00 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
12d10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12d20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12d30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12d40 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
12d50 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
12d60 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e       pBt->readOn
12d70 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ly = 1;.    }.  
12d80 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
12d90 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
12da0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12db0 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
12dc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
12dd0 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
12de0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
12df0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
12e00 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
12e10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12e20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12e30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
12e40 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
12e50 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
12e60 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
12e70 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
12e80 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
12e90 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
12ea0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
12eb0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
12ec0 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
12ed0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
12ee0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
12ef0 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
12f00 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
12f10 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
12f20 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
12f30 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
12f40 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
12f50 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
12f60 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
12f70 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
12f80 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
12f90 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
12fa0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
12fb0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
12fc0 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
12fd0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
12fe0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
12ff0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
13000 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74  e1[19]==2 && pBt
13010 2d 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30  ->doNotUseWAL==0
13020 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
13030 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
13040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13050 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
13060 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
13070 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13090 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
130a0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
130b0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
130c0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
130d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
130e0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
130f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
13110 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
13120 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
13130 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
13140 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
13150 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
13160 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
13170 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
13180 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
13190 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
131a0 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
131b0 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
131c0 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
131d0 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
131e0 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
131f0 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
13200 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
13210 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
13220 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
13230 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
13240 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
13250 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
13260 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
13270 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
13280 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13290 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
132a0 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65  pageSize = (page
132b0 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67  1[16]<<8) | (pag
132c0 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  e1[17]<<16);.   
132d0 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
132e0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
132f0 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
13300 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
13310 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
13320 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
13330 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
13340 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13350 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
13360 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
13370 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
13380 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
13390 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
133a0 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
133b0 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
133c0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
133d0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
133e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
133f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
13400 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
13410 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
13420 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
13430 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
13440 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
13450 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
13460 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
13470 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
13480 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
13490 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
134a0 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
134b0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
134c0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
134d0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
134e0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
134f0 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
13500 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
13510 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
13520 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
13530 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
13540 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
13550 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
13560 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
13570 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
13580 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
13590 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
135a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
135b0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
135c0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
135d0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
13600 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
13610 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
13630 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
13640 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
13650 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
13660 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
13670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13680 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
13690 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
136a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
136b0 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
136c0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
136d0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
136e0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
136f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
13700 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
13710 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13720 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
13730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13740 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13750 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13760 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13770 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
13780 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
13790 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
137a0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
137b0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
137c0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
137d0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
137e0 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
137f0 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
13800 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
13810 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
13820 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
13830 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
13840 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
13850 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
13860 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
13870 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
13880 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
13890 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
138a0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
138b0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
138c0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
138d0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
138e0 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
138f0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
13900 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
13910 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
13920 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
13930 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
13940 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
13950 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
13960 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
13970 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
13980 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
13990 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
139a0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
139b0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
139c0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
139d0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
139e0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
139f0 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
13a00 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
13a10 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
13a20 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
13a30 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
13a40 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
13a50 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
13a60 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
13a70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13a80 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
13a90 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
13aa0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
13ab0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
13ac0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
13ad0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
13ae0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
13af0 2d 20 32 33 29 3b 0a 20 20 61 73 73 65 72 74 28  - 23);.  assert(
13b00 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
13b10 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
13b20 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
13b30 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
13b40 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
13b50 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
13b60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
13b70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
13b80 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
13b90 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
13ba0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
13bb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13bc0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
13bd0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
13be0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
13bf0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
13c00 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
13c10 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
13c20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
13c30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
13c40 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
13c50 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
13c60 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
13c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13c80 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
13c90 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
13ca0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
13cb0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
13cc0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
13cd0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
13ce0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
13cf0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
13d00 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
13d10 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
13d20 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
13d30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13d40 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
13d50 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
13d60 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
13d70 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
13d80 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
13d90 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
13da0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13db0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
13dc0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
13dd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13de0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
13df0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13e00 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
13e10 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
13e20 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
13e30 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
13e40 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65  >aData );.    re
13e50 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
13e60 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d  Page1);.    pBt-
13e70 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
13e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74  .}../*.** If pBt
13e90 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d   points to an em
13ea0 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f  pty file then co
13eb0 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79  nvert that empty
13ec0 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20   file.** into a 
13ed0 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61  new empty databa
13ee0 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
13ef0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
13f00 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  e of.** the data
13f10 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
13f20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
13f30 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
13f40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
13f50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
13f60 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
13f70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
13f80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13f90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
13fa0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  if( pBt->nPage>0
13fb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13fd0 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
13fe0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
13ff0 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
14000 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
14010 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14020 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
14030 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
14040 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
14050 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
14060 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
14070 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
14080 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
14090 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
140a0 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d   );.  data[16] =
140b0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
140c0 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a  Size>>8)&0xff);.
140d0 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38    data[17] = (u8
140e0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
140f0 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64  >>16)&0xff);.  d
14100 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
14110 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
14120 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
14130 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
14140 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
14150 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
14160 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
14170 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
14180 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14190 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
141a0 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
141b0 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
141c0 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
141d0 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
141e0 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
141f0 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
14200 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
14210 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
14220 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
14230 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
14240 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
14250 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14260 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
14270 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
14280 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
14290 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
142a0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
142b0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
142c0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
142d0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
142e0 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
142f0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
14300 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
14310 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
14320 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
14330 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
14340 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
14350 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
14360 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14370 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
14380 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
14390 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
143a0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
143b0 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
143c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
143d0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
143e0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
143f0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
14400 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14410 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
14420 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
14430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14440 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
14450 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
14460 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
14470 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
14480 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
14490 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
144a0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
144b0 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
144c0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
144d0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
144e0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
144f0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
14500 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
14510 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
14520 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
14530 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
14540 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
14550 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
14560 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
14570 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
14580 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
14590 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
145a0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
145b0 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
145c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
145d0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
145e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
145f0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
14600 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
14610 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
14620 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
14630 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
14640 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
14650 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
14660 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
14670 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
14680 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
14690 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
146a0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
146b0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
146c0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
146d0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
146e0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
146f0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
14700 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
14710 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
14720 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
14730 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
14740 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
14750 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
14760 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
14770 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
14780 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
14790 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
147a0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
147b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
147c0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
147d0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
147e0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
147f0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
14800 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
14810 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
14820 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
14830 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
14840 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
14850 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
14860 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
14870 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
14880 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
14890 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
148a0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
148b0 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
148c0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
148d0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
148e0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
148f0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
14900 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
14910 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
14920 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
14930 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
14940 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
14950 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
14960 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
14970 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
14980 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
14990 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
149a0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
149b0 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
149c0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
149d0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
149e0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
149f0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
14a00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14a10 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
14a20 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
14a30 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
14a40 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
14a50 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14a60 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
14a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
14a80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14a90 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
14aa0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
14ab0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
14ac0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
14ad0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
14ae0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
14af0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
14b00 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
14b10 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
14b20 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
14b30 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
14b40 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
14b50 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14b60 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
14b70 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
14b80 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
14b90 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
14ba0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
14bb0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
14bc0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
14bd0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
14be0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
14bf0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
14c00 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
14c10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14c20 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
14c30 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
14c40 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
14c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14c60 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
14c70 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
14c80 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
14c90 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
14ca0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
14cb0 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
14cc0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
14cd0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
14ce0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
14cf0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
14d00 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
14d10 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
14d20 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
14d30 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
14d40 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
14d50 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65  TE) || pBt->isPe
14d60 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c  nding ){.    pBl
14d70 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
14d80 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20  er->db;.  }else 
14d90 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
14da0 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
14db0 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
14dc0 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
14dd0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
14de0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
14df0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
14e00 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=p ){.        p
14e10 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
14e20 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
14e30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14e40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
14e50 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
14e60 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
14e70 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
14e80 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  pBlock);.    rc 
14e90 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
14ea0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
14eb0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
14ec0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
14ed0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
14ee0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
14ef0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
14f00 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
14f10 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
14f20 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
14f30 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
14f40 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
14f50 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
14f60 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
14f70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14f80 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
14f90 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
14fa0 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
14fb0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
14fc0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
14fd0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
14fe0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
14ff0 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
15000 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79  ->initiallyEmpty
15010 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 6e 50 61   = (u8)(pBt->nPa
15020 67 65 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b 0a 20  ge==0);.  do {. 
15030 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
15040 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
15050 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
15060 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
15070 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
15080 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
15090 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
150a0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
150b0 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
150c0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
150d0 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
150e0 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
150f0 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
15100 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
15110 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
15120 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
15130 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15140 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
15150 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
15160 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
15170 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
15180 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
15190 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
151a0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
151b0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
151c0 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
151d0 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
151e0 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
151f0 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
15200 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
15210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15220 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
15230 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72        if( pBt->r
15240 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
15250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
15260 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
15270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
15280 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
15290 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
152a0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
152b0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
152c0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
152d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
152e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
152f0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
15300 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
15310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
15320 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
15340 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15350 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
15360 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
15370 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
15380 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
15390 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
153a0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
153b0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
153c0 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
153d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
153e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
153f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15400 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
15410 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
15420 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
15430 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15440 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
15450 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73  >sharable ){..as
15460 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
15470 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
15480 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
15490 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
154a0 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
154b0 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
154c0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
154d0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
154e0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
154f0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
15500 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
15510 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
15520 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
15530 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
15540 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
15550 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
15560 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
15570 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15580 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
15590 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
155a0 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
155b0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
155c0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
155d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
155e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
155f0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
15600 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
15610 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
15620 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
15630 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
15640 77 72 66 6c 61 67 3e 31 29 3b 0a 23 65 6e 64 69  wrflag>1);.#endi
15650 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
15660 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
15670 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
15680 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
15690 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
156a0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
156b0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
156c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
156d0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
156e0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
156f0 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
15700 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
15710 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
15720 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
15730 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
15740 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
15750 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
15760 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
15770 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
15780 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
15790 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
157a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
157b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
157c0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
157d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
157e0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
157f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15800 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
15810 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
15820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15840 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
15850 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
15860 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
15870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15880 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
15890 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
158a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
158b0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
158c0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
158d0 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
158e0 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
158f0 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
15900 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
15910 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
15920 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
15930 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
15940 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
15950 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
15960 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
15970 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
15980 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
15990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
159a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
159b0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
159c0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
159d0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
159e0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
159f0 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
15a00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15a10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
15a20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15a30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
15a40 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
15a50 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
15a60 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
15a70 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
15a80 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
15a90 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
15aa0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
15ab0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
15ac0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
15ad0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
15ae0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
15af0 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
15b00 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
15b10 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
15b20 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
15b30 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
15b60 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
15b70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b90 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
15ba0 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
15bb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15be0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
15bf0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
15c00 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
15c10 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
15c20 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
15c30 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
15c40 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
15c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15c60 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
15c70 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
15c80 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
15c90 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
15ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
15cb0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
15cc0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
15cd0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
15ce0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
15cf0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
15d00 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
15d10 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
15d20 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
15d30 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
15d40 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
15d50 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
15d60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
15d70 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
15d80 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
15d90 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
15da0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
15db0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
15dc0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
15dd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
15de0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
15df0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
15e00 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
15e10 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
15e20 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
15e30 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15e40 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
15e50 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
15e60 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
15e70 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
15e80 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
15e90 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
15ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15eb0 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
15ec0 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
15ed0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
15ee0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
15ef0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
15f00 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
15f10 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
15f20 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
15f30 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
15f40 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
15f50 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
15f60 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
15f70 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
15f80 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
15f90 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
15fa0 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
15fb0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
15fc0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
15fd0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
15fe0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
15ff0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
16000 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16010 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
16020 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
16040 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
16050 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
16060 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
16070 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
16080 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
16090 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
160a0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
160b0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
160e0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
160f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
16100 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
16110 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
16120 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
16130 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
16140 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16150 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
16160 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
16170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16180 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
16190 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
161a0 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
161b0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
161c0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
161d0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
161e0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
161f0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
16200 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
16210 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
16220 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
16230 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
16240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16250 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
16260 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
16270 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
16280 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
16290 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
162a0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
162b0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
162c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
162d0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
162e0 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
162f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
16300 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
16310 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
16320 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
16330 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
16340 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
16350 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16360 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
16370 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
16380 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
16390 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
163a0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
163b0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
163c0 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  .iOverflow.     
163d0 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
163e0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70  o.iOverflow+3<=p
163f0 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
16400 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20  e->maskPage.    
16410 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67       && iFrom==g
16420 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
16430 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a  nfo.iOverflow]).
16440 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
16450 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
16460 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
16470 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
16480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
164a0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
164b0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
164c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
164d0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
164e0 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
164f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16500 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16510 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
16520 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
16530 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
16540 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
16550 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
16560 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
16570 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
16580 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
16590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
165a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
165b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
165c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
165d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
165e0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
165f0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
16600 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
16610 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
16620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16630 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
16640 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
16650 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
16660 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
16670 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
16680 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
16690 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
166a0 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
166b0 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
166c0 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
166d0 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
166e0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
166f0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
16700 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
16710 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
16720 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
16730 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
16740 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
16750 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
16760 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
16770 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
16780 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
16790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
167a0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
167b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
167c0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
167d0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
167e0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
167f0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
16800 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
16810 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
16820 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
16830 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
16840 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
16850 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
16860 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16870 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
16880 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
16890 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
168a0 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
168b0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
168c0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
168d0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
168e0 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
168f0 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
16900 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
16910 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
16920 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
16930 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
16940 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
16950 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
16960 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
16970 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
16980 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
16990 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
169a0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
169b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
169c0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
169d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
169e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
169f0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
16a00 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
16a10 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
16a20 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
16a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
16a40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16a50 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
16a60 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
16a70 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
16a80 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
16a90 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
16aa0 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
16ab0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
16ac0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
16ad0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
16ae0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
16af0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
16b00 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
16b10 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
16b20 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
16b30 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
16b40 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
16b50 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
16b60 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
16b70 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
16b80 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
16b90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
16bb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
16bc0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
16bd0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
16be0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
16bf0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
16c00 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
16c10 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
16c20 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
16c30 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
16c40 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
16c50 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
16c60 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
16c70 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
16c80 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
16c90 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
16ca0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
16cb0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
16cc0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
16cd0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
16ce0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
16cf0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
16d00 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
16d10 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
16d20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
16d30 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
16d40 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
16d50 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
16d60 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
16d70 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16d80 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
16d90 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
16da0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
16db0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
16dc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
16dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16de0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16df0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
16e00 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
16e10 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
16e20 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
16e30 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
16e40 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
16e50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
16e60 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
16e70 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
16e80 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
16e90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16ea0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16eb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16ec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16ed0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
16ee0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
16ef0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
16f00 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
16f10 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
16f20 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
16f30 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
16f40 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
16f50 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
16f60 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
16f70 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
16f80 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
16f90 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
16fa0 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
16fb0 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
16fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16ff0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17000 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
17010 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
17020 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17040 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
17050 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
17060 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17070 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
17080 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
17090 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
170a0 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
170b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
170c0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
170d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
170e0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
170f0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
17100 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
17110 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
17120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17130 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
17140 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
17150 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
17160 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
17170 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
17180 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
17190 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
171a0 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
171b0 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
171c0 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
171d0 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
171e0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
171f0 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
17200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
17210 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
17220 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
17230 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
17240 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
17250 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
17260 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
17270 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
17280 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
17290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
172a0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
172b0 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
172c0 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
172d0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
172e0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
172f0 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
17300 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
17310 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
17320 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
17330 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
17340 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
17350 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
17360 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
17370 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
17380 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
17390 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
173a0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
173b0 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
173c0 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
173d0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
173e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
173f0 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
17400 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
17410 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 20  s is complete.  
17420 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
17430 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
17440 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63 75 75  hat.** incrVacuu
17450 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62 65 20  mStep() will be 
17460 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74 65 20  called a finite 
17470 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73 0a  amount of times.
17480 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  ** which may or 
17490 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20 74 68  may not empty th
174a0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41 20 66  e freelist.  A f
174b0 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d 0a 2a  ull autovacuum.*
174c0 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20 20 41  * has nFin>0.  A
174d0 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65   "PRAGMA increme
174e0 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68 61 73  ntal_vacuum" has
174f0 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61   nFin==0..*/.sta
17500 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
17510 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
17520 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
17530 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a   Pgno iLastPg){.
17540 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
17550 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17560 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
17570 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
17580 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
17590 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
175a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
175b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
175c0 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
175d0 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
175e0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
175f0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
17600 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
17610 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
17620 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
17630 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
17640 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
17650 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
17660 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
17670 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
17680 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
17690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
176a0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
176b0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
176c0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
176d0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
176e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
176f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
17720 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
17730 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
17740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17750 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
17760 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
17770 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
17780 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46   ){.      if( nF
17790 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  in==0 ){.       
177a0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
177b0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
177c0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
177d0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
177e0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
177f0 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72   nFin is non-zer
17800 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
17810 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
17820 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
17830 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
17840 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
17850 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
17860 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
17870 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
17880 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
17890 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
178a0 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
178b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
178c0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
178d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
178e0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
178f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
17900 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
17910 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
17920 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20  iLastPg, 1);.   
17930 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17950 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17970 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
17980 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
17990 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
179a0 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
179b0 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
179c0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
179d0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
179e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
179f0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
17a00 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
17a10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
17a20 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg;..      rc = 
17a30 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17a40 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
17a50 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
17a60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17a70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17a80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
17a90 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
17aa0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
17ab0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
17ac0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
17ad0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
17ae0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
17af0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
17b00 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
17b10 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
17b20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17b30 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
17b40 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
17b50 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
17b60 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
17b70 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
17b80 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
17b90 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
17ba0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
17bb0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
17bc0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
17bd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17be0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
17bf0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
17c00 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
17c10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
17c20 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
17c30 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
17c40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17c50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17c60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17c70 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
17c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17ca0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
17cb0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
17cc0 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
17cd0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
17ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
17cf0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
17d00 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
17d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17d20 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
17d30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
17d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17d60 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
17d70 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
17d80 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
17d90 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a  eePg, nFin!=0);.
17da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
17db0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
17dc0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
17dd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17de0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17e00 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d    }..  if( nFin=
17e10 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
17e20 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g--;.    while( 
17e30 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
17e40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c  _BYTE_PAGE(pBt)|
17e50 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  |PTRMAP_ISPAGE(p
17e60 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
17e70 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50        if( PTRMAP
17e80 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
17e90 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20  stPg) ){.       
17ea0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20   MemPage *pPg;. 
17eb0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
17ec0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
17ed0 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b  astPg, &pPg, 0);
17ee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17f10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
17f20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17f30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
17f40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
17f50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17f60 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Pg);.        if(
17f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17f80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17f90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17fb0 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a  LastPg--;.    }.
17fc0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
17fd0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
17fe0 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74  t->pPager, iLast
17ff0 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  Pg);.    pBt->nP
18000 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
18010 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18020 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18030 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
18040 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
18050 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
18060 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
18070 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
18080 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
18090 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
180a0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
180b0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
180c0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
180d0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
180e0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
180f0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
18100 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
18110 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
18120 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
18130 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
18140 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
18150 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18160 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
18170 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
18180 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
18190 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
181a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
181b0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
181c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
181d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
181e0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
181f0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
18200 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
18210 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
18220 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18230 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
18240 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
18250 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
18260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18270 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
18280 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
18290 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
182a0 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 62  umStep(pBt, 0, b
182b0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
182c0 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  t));.    if( rc=
182d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
182e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
182f0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
18300 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
18310 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
18320 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18330 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
18340 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
18350 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18360 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18370 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
18380 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
18390 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
183a0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
183b0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
183c0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
183d0 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
183e0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
183f0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
18400 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
18410 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
18420 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
18430 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
18440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18450 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
18460 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
18470 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
18480 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
18490 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
184a0 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
184b0 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
184c0 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
184d0 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
184e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
184f0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
18500 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
18510 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18520 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
18530 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
18540 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
18550 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
18560 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
18570 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
18580 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18590 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
185a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
185b0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
185c0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
185d0 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
185e0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
185f0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
18600 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
18610 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
18620 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18630 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
18640 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
18650 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
18660 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18670 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
18680 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
18690 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
186a0 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f   nPtrmap;      /
186b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
186c0 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
186d0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
186e0 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
186f0 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
18700 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
18710 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20     int nEntry;  
18720 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18730 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
18740 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
18750 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
18760 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
18770 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
18780 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
18790 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
187a0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
187b0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
187c0 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
187d0 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
187e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
187f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
18800 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
18810 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
18820 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
18830 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
18840 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
18850 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
18860 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
18870 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
18880 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
18890 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
188a0 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
188b0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
188c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
188d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
188e0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
188f0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
18900 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18910 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e  ta[36]);.    nEn
18920 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
18930 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74  eSize/5;.    nPt
18940 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
18950 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
18960 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
18970 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
18980 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
18990 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
189a0 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e  ;.    if( nOrig>
189b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
189c0 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
189d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
189e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
189f0 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
18a00 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
18a10 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
18a20 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
18a30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18a40 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
18a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18a60 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
18a70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18a80 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f  PT_BKPT;..    fo
18a90 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
18aa0 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
18ab0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
18ac0 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
18ad0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
18ae0 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
18af0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18b00 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
18b10 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
18b20 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
18b30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18b40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
18b50 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
18b60 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
18b70 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18b80 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
18b90 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
18ba0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18bb0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
18bc0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
18bd0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18be0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
18bf0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
18c00 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
18c10 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
18c20 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
18c30 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
18c40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
18c60 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18c70 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
18c80 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
18c90 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
18ca0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
18cb0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
18cc0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
18cd0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
18ce0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
18cf0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
18d00 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
18d10 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
18d20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18d30 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
18d40 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
18d50 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
18d60 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
18d70 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
18d80 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
18d90 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
18da0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
18db0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
18dc0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
18dd0 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
18de0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
18df0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
18e00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
18e10 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
18e20 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
18e30 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
18e40 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
18e50 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
18e60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
18e70 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
18e80 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
18e90 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
18ea0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
18eb0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
18ec0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
18ed0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
18ee0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
18ef0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18f00 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
18f10 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
18f20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
18f30 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
18f40 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
18f50 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
18f60 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
18f70 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
18f80 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
18f90 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
18fa0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
18fb0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
18fc0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
18fd0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
18fe0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
18ff0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
19000 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
19010 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
19020 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
19030 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
19040 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
19050 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
19060 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
19070 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
19080 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
19090 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
190a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
190b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
190c0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
190d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
190e0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
190f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
19100 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
19110 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
19120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
19130 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
19140 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
19150 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
19160 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
19170 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
19180 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
19190 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
191a0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
191b0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
191c0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
191d0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
191e0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
191f0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
19200 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
19210 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
19220 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
19230 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
19240 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
19250 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
19260 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
19270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19280 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
19290 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
192a0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
192b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
192c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
192d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
192e0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
192f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19300 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
19310 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
19320 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19330 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
19340 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
19350 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
19360 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
19370 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
19380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
193a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
193b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
193c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
193d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
193e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
193f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
19400 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
19410 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
19420 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19430 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
19450 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
19460 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
19470 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
19480 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
19490 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
194a0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
194b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
194c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
194d0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
194e0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
194f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19500 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
19510 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
19520 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
19530 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
19540 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69  ontent(pBt);.  i
19550 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
19560 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64  ANS_NONE && p->d
19570 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
19580 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
19590 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
195a0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
195b0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
195c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
195d0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
195e0 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
195f0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
19600 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
19610 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
19620 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
19630 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
19640 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
19650 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
19660 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
19670 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
19680 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
19690 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
196a0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
196b0 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
196c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
196d0 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
196e0 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
196f0 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
19700 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
19710 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
19720 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
19730 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
19740 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
19750 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
19760 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
19770 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
19780 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
19790 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
197a0 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
197b0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
197c0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
197d0 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
197e0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
197f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
19800 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
19810 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
19820 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
19830 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
19840 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
19850 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
19860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
19870 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
19880 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
19890 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
198a0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
198b0 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
198c0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
198d0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
198e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
198f0 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
19900 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
19910 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
19920 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
19930 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
19940 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
19950 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
19960 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
19970 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
19980 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19990 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
199a0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
199b0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
199c0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
199d0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
199e0 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
199f0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
19a00 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
19a10 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
19a20 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
19a30 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
19a40 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
19a50 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
19a60 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
19a70 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
19a80 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
19a90 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
19aa0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
19ab0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
19ac0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
19ad0 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
19ae0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
19af0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
19b00 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
19b10 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
19b20 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
19b30 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
19b40 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
19b50 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
19b60 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
19b70 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
19b80 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
19b90 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
19ba0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
19bb0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
19bc0 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
19bd0 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
19be0 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
19bf0 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
19c00 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
19c10 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
19c20 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
19c30 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
19c40 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
19c50 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
19c60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19c70 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
19c80 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
19c90 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
19ca0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
19cb0 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
19cc0 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
19cd0 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
19ce0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
19cf0 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
19d00 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
19d10 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
19d20 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
19d30 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
19d40 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
19d50 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
19d60 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
19d70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19d80 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
19d90 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
19da0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
19db0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
19dc0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
19dd0 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
19de0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
19df0 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
19e00 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
19e10 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
19e20 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
19e30 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
19e40 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
19e50 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
19e60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
19e70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19e80 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
19e90 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
19ea0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
19eb0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
19ec0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
19ed0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
19ee0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
19ef0 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
19f00 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
19f10 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
19f20 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
19f30 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
19f40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19f50 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
19f60 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
19f70 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
19f80 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19f90 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
19fa0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
19fb0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
19fc0 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
19fd0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
19fe0 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
19ff0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1a000 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1a010 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1a020 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a030 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1a040 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1a050 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1a060 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1a070 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1a080 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1a090 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1a0a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1a0b0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1a0c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a0d0 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1a0e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a0f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a100 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a110 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1a120 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1a130 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
1a140 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1a150 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1a160 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a170 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a180 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a190 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1a1a0 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1a1b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1a1c0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1a1d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1a1e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a1f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a200 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a210 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1a220 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a230 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a240 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1a250 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1a260 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1a270 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a280 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1a290 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1a2a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1a2b0 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
1a2c0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
1a2d0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
1a2e0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1a2f0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1a300 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1a310 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1a320 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1a330 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
1a340 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1a350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
1a360 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
1a370 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
1a380 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
1a390 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
1a3a0 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
1a3b0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
1a3c0 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
1a3d0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
1a3e0 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
1a3f0 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
1a400 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
1a410 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
1a420 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
1a430 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
1a440 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
1a450 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
1a460 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
1a470 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a480 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a490 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a4a0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a4b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a4c0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
1a4d0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
1a4e0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
1a4f0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
1a500 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
1a510 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a520 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1a530 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1a540 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1a550 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1a560 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1a570 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
1a580 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
1a590 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
1a5a0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1a5b0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1a5c0 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
1a5d0 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
1a5e0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1a5f0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1a600 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
1a610 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
1a620 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1a630 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1a640 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1a650 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1a660 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
1a670 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
1a680 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
1a690 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
1a6a0 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
1a6b0 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
1a6c0 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
1a6d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
1a6e0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1a6f0 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
1a700 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
1a710 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
1a720 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
1a730 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
1a740 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1a750 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
1a760 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
1a770 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
1a780 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1a790 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1a7a0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1a7b0 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
1a7c0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c  Cursor *p;.  sql
1a7d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a7e0 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
1a7f0 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1a800 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1a810 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
1a820 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a830 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1a840 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
1a850 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1a860 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1a870 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
1a880 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1a890 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1a8a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1a8b0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1a8c0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1a8d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1a8e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a8f0 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
1a900 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
1a910 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1a920 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
1a930 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
1a940 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
1a950 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
1a960 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1a970 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
1a980 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
1a990 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1a9a0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
1a9b0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
1a9c0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1a9d0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1a9e0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1a9f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1aa00 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1aa10 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1aa20 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1aa30 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1aa40 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1aa50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1aa60 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1aa70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1aa80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1aa90 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1aaa0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1aab0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1aac0 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  );.  rc = saveAl
1aad0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1aae0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
1aaf0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1ab00 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
1ab10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
1ab30 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
1ab40 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
1ab50 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72  c() error occurr
1ab60 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
1ab70 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
1ab80 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
1ab90 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
1aba0 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
1abb0 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
1abc0 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
1abd0 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
1abe0 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
1abf0 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
1ac00 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
1ac10 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
1ac20 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
1ac30 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
1ac40 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
1ac50 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
1ac60 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
1ac70 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
1ac80 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
1ac90 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
1aca0 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
1acb0 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
1acc0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
1acd0 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
1ace0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1acf0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1ad00 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
1ad10 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
1ad20 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1ad30 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1ad40 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1ad50 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
1ad60 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
1ad70 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
1ad80 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
1ad90 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
1ada0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
1adb0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1adc0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
1add0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1ade0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
1adf0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
1ae00 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
1ae10 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
1ae20 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
1ae30 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
1ae40 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
1ae50 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
1ae60 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
1ae70 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
1ae80 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
1ae90 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
1aea0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
1aeb0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
1aec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1aed0 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
1aee0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
1aef0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
1af00 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
1af10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1af20 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
1af30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1af40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
1af50 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
1af60 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
1af70 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
1af80 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1af90 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
1afa0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
1afb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1afc0 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
1afd0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
1afe0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1aff0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1b000 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  READ;.  }..  btr
1b010 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1b020 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1b030 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1b040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b050 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1b060 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1b070 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1b080 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
1b090 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1b0a0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1b0b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1b0c0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1b0d0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1b0e0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1b0f0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1b100 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1b110 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1b120 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1b130 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1b140 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1b150 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1b160 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1b170 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b180 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1b190 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1b1a0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1b1b0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1b1c0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1b1d0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1b1e0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1b1f0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1b200 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1b210 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1b220 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1b230 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1b240 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1b250 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1b260 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1b270 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1b280 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1b290 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1b2a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1b2b0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1b2c0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1b2d0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1b2e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1b2f0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1b300 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1b310 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1b320 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1b330 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1b340 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1b350 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1b360 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1b370 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1b380 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1b390 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1b3a0 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1b3b0 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1b3c0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1b3d0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1b3e0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1b3f0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1b400 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1b410 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1b420 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1b430 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b440 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1b450 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1b460 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1b470 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1b480 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1b490 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b4a0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1b4b0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b4c0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1b4d0 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  rt( pBt->readOnl
1b4e0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
1b4f0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
1b500 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1b510 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
1b520 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
1b530 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1b540 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b550 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
1b560 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
1b570 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
1b580 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
1b590 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
1b5a0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
1b5b0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
1b5c0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
1b5d0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
1b5e0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
1b5f0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
1b600 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
1b610 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
1b620 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
1b630 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
1b640 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
1b650 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1b660 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
1b670 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1b680 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1b690 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b6a0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
1b6b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b6c0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b6d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1b6e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b6f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1b700 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
1b710 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1b720 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
1b730 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
1b740 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
1b750 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
1b760 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
1b770 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
1b780 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1b790 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
1b7a0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1b7b0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
1b7c0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1b7d0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
1b7e0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1b7f0 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
1b800 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
1b810 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
1b820 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
1b830 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
1b840 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
1b850 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
1b860 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
1b870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
1b880 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
1b890 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
1b8a0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
1b8b0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1b8c0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
1b8d0 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
1b8e0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
1b8f0 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
1b900 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
1b910 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1b920 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1b930 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
1b940 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
1b950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1b960 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
1b970 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1b980 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1b990 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1b9a0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
1b9b0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1b9c0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
1b9d0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
1b9e0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1b9f0 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1ba00 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1ba10 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1ba20 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1ba30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ba40 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1ba50 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1ba60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1ba70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1ba80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ba90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1baa0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
1bab0 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79  & pBt->initially
1bac0 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e 50 61  Empty ) pBt->nPa
1bad0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ge = 0;.      rc
1bae0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1baf0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
1bb00 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1bb10 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
1bb20 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
1bb30 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1bb40 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
1bb50 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
1bb60 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
1bb70 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
1bb80 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1bb90 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
1bba0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
1bbb0 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
1bbc0 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
1bbd0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
1bbe0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
1bbf0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
1bc00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1bc10 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1bc20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bc30 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
1bc40 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
1bc50 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
1bc60 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
1bc70 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
1bc80 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
1bc90 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
1bca0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
1bcb0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
1bcc0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
1bcd0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
1bce0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
1bcf0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
1bd00 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
1bd10 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
1bd20 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
1bd30 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1bd40 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
1bd50 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
1bd60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1bd70 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
1bd80 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1bd90 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
1bda0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
1bdb0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
1bdc0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1bdd0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
1bde0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
1bdf0 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
1be00 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
1be10 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
1be20 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
1be30 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
1be40 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
1be50 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
1be60 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
1be70 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
1be80 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
1be90 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
1bea0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
1beb0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
1bec0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
1bed0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1bee0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
1bef0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
1bf00 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
1bf10 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
1bf20 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
1bf30 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
1bf40 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
1bf50 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
1bf60 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
1bf70 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
1bf80 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
1bf90 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
1bfa0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
1bfb0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
1bfc0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
1bfd0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
1bfe0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1bff0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1c000 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
1c010 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
1c020 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
1c030 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
1c040 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
1c050 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
1c060 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1c070 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
1c080 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
1c090 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
1c0a0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
1c0b0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
1c0c0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
1c0d0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
1c0e0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
1c0f0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
1c100 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
1c110 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
1c120 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
1c130 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1c140 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
1c150 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
1c160 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
1c170 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
1c180 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1c190 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1c1a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
1c1b0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
1c1c0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1e0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1c1f0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1c200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c220 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1c230 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1c240 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
1c270 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
1c280 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
1c290 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2b0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
1c2c0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1c2d0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
1c2e0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c300 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
1c310 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
1c320 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1c330 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1c340 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
1c350 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
1c360 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c370 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1c380 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
1c390 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
1c3a0 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
1c3b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c3c0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
1c3d0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
1c3e0 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
1c3f0 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
1c400 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
1c410 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1c420 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
1c430 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
1c440 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
1c450 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1c460 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
1c470 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
1c480 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
1c490 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
1c4a0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1c4b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c4c0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
1c4d0 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
1c4e0 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
1c4f0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
1c500 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1c510 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
1c520 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
1c530 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
1c540 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
1c550 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
1c560 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
1c570 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1c580 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
1c590 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
1c5a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1c5b0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
1c5c0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
1c5d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c5e0 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  ta );..  if( NEV
1c5f0 45 52 28 77 72 46 6c 61 67 20 26 26 20 70 42 74  ER(wrFlag && pBt
1c600 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
1c610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c620 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
1c630 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
1c640 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
1c650 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
1c660 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1c670 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
1c680 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
1c690 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
1c6a0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
1c6b0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
1c6c0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
1c6d0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
1c6e0 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
1c6f0 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
1c700 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
1c710 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
1c720 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
1c730 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
1c740 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
1c750 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1c760 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
1c770 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
1c780 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
1c790 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77  ->wrFlag = (u8)w
1c7a0 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70  rFlag;.  pCur->p
1c7b0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
1c7c0 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  sor;.  if( pCur-
1c7d0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
1c7e0 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1c7f0 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70   = pCur;.  }.  p
1c800 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1c810 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
1c820 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1c830 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63  LID;.  pCur->cac
1c840 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  hedRowid = 0;.  
1c850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c860 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
1c870 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1c880 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c8b0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1c8c0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1c8f0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1c900 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1c910 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c930 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
1c940 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
1c950 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
1c960 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1c990 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
1c9a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1c9b0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c9d0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
1c9e0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
1c9f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1ca00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ca10 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
1ca20 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
1ca30 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
1ca40 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
1ca50 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ca60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ca80 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
1ca90 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
1caa0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1cab0 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
1cac0 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
1cad0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
1cae0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
1caf0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
1cb00 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
1cb10 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
1cb20 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
1cb30 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
1cb40 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
1cb50 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
1cb60 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
1cb70 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
1cb80 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
1cb90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1cba0 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
1cbb0 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
1cbc0 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
1cbd0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
1cbe0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
1cbf0 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
1cc00 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
1cc10 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
1cc20 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
1cc30 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
1cc40 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
1cc50 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
1cc60 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
1cc70 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
1cc80 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
1cc90 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
1cca0 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
1ccb0 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
1ccc0 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
1ccd0 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
1cce0 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
1ccf0 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
1cd00 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
1cd10 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
1cd20 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
1cd30 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1cd40 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
1cd50 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
1cd60 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
1cd70 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67  f(BtCursor, iPag
1cd80 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  e));.}../*.** Se
1cd90 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  t the cached row
1cda0 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  id value of ever
1cdb0 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20  y cursor in the 
1cdc0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1cdd0 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e  le.** as pCur an
1cde0 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  d having the sam
1cdf0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
1ce00 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65  er as pCur.  The
1ce10 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
1ce20 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a   to iRowid..**.*
1ce30 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20  * Only positive 
1ce40 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65  rowid values are
1ce50 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69   considered vali
1ce60 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65  d for this cache
1ce70 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69  ..** The cache i
1ce80 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1ce90 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e   zero, indicatin
1cea0 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63  g an invalid cac
1ceb0 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77  he..** A btree w
1cec0 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69  ill work fine wi
1ced0 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  th zero or negat
1cee0 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20  ive rowids.  We 
1cef0 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63  just cannot.** c
1cf00 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67  ache zero or neg
1cf10 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68  ative rowids, wh
1cf20 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73  ich means tables
1cf30 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f   that use zero o
1cf40 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f  r.** negative ro
1cf50 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61  wids might run a
1cf60 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
1cf70 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65   But in practice
1cf80 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67  , zero.** or neg
1cf90 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65  ative rowids are
1cfa0 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73   very uncommon s
1cfb0 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  o this should no
1cfc0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
1cfd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1cfe0 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
1cff0 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1d000 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
1d010 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75   iRowid){.  BtCu
1d020 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1d030 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72  =pCur->pBt->pCur
1d040 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1d050 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1d060 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e  pgnoRoot==pCur->
1d070 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61  pgnoRoot ) p->ca
1d080 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77  chedRowid = iRow
1d090 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  id;.  }.  assert
1d0a0 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  ( pCur->cachedRo
1d0b0 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d  wid==iRowid );.}
1d0c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d0d0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1d0e0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
1d0f0 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76  rsor.  A negativ
1d100 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74  e or zero.** ret
1d110 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1d120 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77  tes that the row
1d130 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61  id cache is inva
1d140 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
1d150 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49  e.** ignored.  I
1d160 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  f the rowid cach
1d170 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  e has never befo
1d180 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65  re been set, the
1d190 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72  n a.** zero is r
1d1a0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69  eturned..*/.sqli
1d1b0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1d1c0 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52  3BtreeGetCachedR
1d1d0 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1d1e0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1d1f0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1d200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1d210 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1d220 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1d230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1d240 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
1d250 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
1d260 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
1d270 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d280 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
1d290 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d2a0 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
1d2b0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1d2c0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1d2d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
1d2e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1d2f0 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
1d300 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1d310 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
1d320 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1d330 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  or(pCur);.    if
1d340 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
1d350 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72  .      pCur->pPr
1d360 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
1d370 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
1d380 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  se{.      pBt->p
1d390 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
1d3a0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1d3b0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1d3c0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1d3d0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1d3e0 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  ur->pPrev;.    }
1d3f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d400 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1d410 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1d420 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1d430 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1d440 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d450 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1d460 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1d470 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
1d480 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
1d490 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
1d4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1d4b0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1d4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d4d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
1d4e0 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
1d4f0 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
1d500 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
1d510 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
1d520 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
1d530 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1d540 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
1d550 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
1d560 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
1d570 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
1d580 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
1d590 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
1d5a0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1d5b0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
1d5c0 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
1d5d0 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
1d5e0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
1d5f0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
1d600 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
1d610 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
1d620 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
1d630 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
1d640 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
1d650 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
1d660 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
1d670 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
1d680 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
1d690 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
1d6a0 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
1d6b0 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
1d6c0 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
1d6d0 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
1d6e0 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
1d6f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
1d700 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
1d710 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
1d720 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
1d730 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
1d740 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
1d750 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
1d760 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
1d770 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
1d780 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
1d790 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
1d7a0 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
1d7b0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
1d7c0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
1d7d0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1d7e0 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
1d7f0 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
1d800 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1d810 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
1d820 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
1d830 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
1d840 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1d850 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
1d860 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1d870 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
1d880 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26  assert( memcmp(&
1d890 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
1d8a0 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
1d8b0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
1d8c0 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
1d8d0 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
1d8e0 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f  dif.#ifdef _MSC_
1d8f0 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72  VER.  /* Use a r
1d900 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  eal function in 
1d910 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f  MSVC to work aro
1d920 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74  und bugs in that
1d930 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20   compiler. */.  
1d940 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43  static void getC
1d950 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1d960 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28   *pCur){.    if(
1d970 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1d980 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==0 ){.      in
1d990 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1d9a0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72  iPage;.      btr
1d9b0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1d9c0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1d9d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1d9e0 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1d9f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1da00 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1da10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1da20 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1da30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
1da40 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
1da50 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
1da60 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
1da70 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
1da80 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
1da90 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
1daa0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
1dab0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
1db00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1db10 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db40 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
1db50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1db60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65       \.    btree
1dba0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1dbb0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1dbc0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1dbd0 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c  ,&pCur->info); \
1dbe0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1dbf0 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
1dc90 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
1dce0 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23  * _MSC_VER */..#
1dcf0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
1dd00 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
1dd10 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
1dd20 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1dd30 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
1dd40 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1dd50 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
1dd60 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
1dd70 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
1dd80 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
1dd90 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1dda0 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
1ddb0 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
1ddc0 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
1ddd0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
1dde0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
1ddf0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1de00 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
1de10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1de20 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
1de30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1de40 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
1de50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1de60 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
1de70 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
1de80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1de90 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1dea0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1deb0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1dec0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1ded0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1dee0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1def0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1df00 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1df10 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1df20 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1df30 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1df40 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1df50 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1df60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1df70 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1df80 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1df90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1dfa0 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
1dfb0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1dfc0 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
1dfd0 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
1dfe0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1dff0 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
1e000 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1e010 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
1e020 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1e030 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
1e040 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1e050 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1e060 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
1e070 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e080 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e090 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e0a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e0b0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1e0c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e0d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
1e0e0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
1e0f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1e100 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b  .    *pSize = 0;
1e110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65  .  }else{.    ge
1e120 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1e130 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  .    *pSize = pC
1e140 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1e150 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1e160 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e170 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1e180 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1e190 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1e1a0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1e1b0 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1e1c0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
1e1d0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1e1e0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
1e1f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
1e200 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
1e210 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
1e220 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
1e230 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
1e240 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
1e250 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
1e260 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
1e270 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
1e280 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
1e290 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
1e2a0 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
1e2b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1e2c0 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
1e2d0 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
1e2e0 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
1e2f0 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
1e300 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
1e310 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
1e320 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
1e330 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
1e340 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
1e350 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
1e360 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1e370 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
1e380 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
1e390 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1e3a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1e3b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1e3c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1e3d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1e3e0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1e3f0 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
1e400 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1e410 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e420 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
1e430 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1e440 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1e450 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1e460 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1e470 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1e480 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1e490 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1e4a0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1e4b0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1e4c0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1e4d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1e4e0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1e4f0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1e500 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1e510 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1e520 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1e530 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1e540 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1e550 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1e560 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1e570 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1e580 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1e590 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1e5a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e5b0 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1e5c0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1e5d0 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1e5e0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1e5f0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1e600 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1e610 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1e620 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1e630 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1e640 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1e650 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1e660 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1e670 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1e680 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1e690 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1e6a0 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1e6b0 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1e6c0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1e6d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1e6e0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1e6f0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1e700 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1e710 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1e720 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1e730 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1e740 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1e750 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1e760 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1e770 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1e780 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1e790 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1e7a0 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1e7b0 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1e7c0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1e7d0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1e7e0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1e7f0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1e800 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1e810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1e820 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1e830 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e850 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
1e860 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1e870 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1e880 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1e890 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1e8a0 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1e8b0 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1e8c0 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1e8d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1e8e0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1e8f0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1e900 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1e910 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e920 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1e930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1e940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e950 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1e960 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1e970 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1e980 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e990 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e9a0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1e9b0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1e9c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1e9d0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1e9e0 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1e9f0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1ea00 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1ea10 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1ea20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1ea30 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1ea40 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1ea50 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1ea60 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1ea70 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1ea80 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1ea90 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1eaa0 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1eab0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1eac0 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1ead0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1eae0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1eaf0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1eb00 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1eb10 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1eb20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1eb30 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1eb40 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1eb50 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1eb60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1eb70 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1eb80 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1eb90 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
1eba0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1ebb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1ebc0 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1ebd0 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1ebe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ebf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1ec00 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1ec10 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1ec20 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1ec30 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1ec40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ec50 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1ec60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1ec70 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
1ec80 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
1ec90 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
1eca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ecb0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1ecc0 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1ecd0 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1ece0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1ecf0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1ed00 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
1ed10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ed20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1ed30 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1ed40 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1ed50 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1ed60 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1ed70 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1ed80 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1ed90 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1eda0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1edb0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1edc0 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1edd0 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1ede0 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1edf0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1ee00 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1ee10 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1ee20 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1ee30 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1ee40 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1ee50 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1ee60 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1ee70 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1ee80 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1ee90 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1eea0 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1eeb0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1eec0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1eed0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1eee0 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1eef0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1ef00 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1ef10 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1ef20 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1ef30 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1ef40 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1ef50 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1ef60 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1ef70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ef80 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1ef90 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1efa0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1efb0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1efc0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1efd0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1efe0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1eff0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1f000 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1f010 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1f020 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1f030 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1f040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f050 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1f060 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1f070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f080 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1f090 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1f0a0 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1f0b0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1f0c0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1f0d0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1f0e0 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1f0f0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1f100 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1f110 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1f120 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1f130 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1f140 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f150 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1f160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f180 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f190 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1f1a0 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1f1b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f1c0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1f1d0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1f1e0 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1f1f0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1f200 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1f210 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1f220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f240 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1f250 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1f260 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1f270 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1f280 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1f290 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1f2a0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1f2b0 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1f2c0 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1f2d0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1f2e0 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1f2f0 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1f300 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1f310 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1f320 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1f330 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1f340 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1f350 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1f360 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1f370 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1f380 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1f390 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1f3a0 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1f3b0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1f3c0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
1f3d0 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
1f3e0 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
1f3f0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
1f400 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
1f410 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1f420 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
1f430 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1f440 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1f450 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1f460 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1f470 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1f480 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1f490 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1f4a0 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1f4b0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1f4c0 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1f4d0 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1f4e0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1f4f0 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1f500 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1f510 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1f520 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1f530 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1f540 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1f550 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1f560 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1f570 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1f580 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1f590 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1f5a0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1f5b0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1f5c0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1f5d0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1f5e0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1f5f0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1f600 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1f610 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1f620 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1f630 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1f640 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1f650 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1f660 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1f670 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1f680 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1f690 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1f6a0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1f6b0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1f6c0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1f6d0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1f6e0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1f6f0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1f700 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1f710 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1f720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f730 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1f740 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1f750 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1f760 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1f770 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1f780 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1f790 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1f7a0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1f7b0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1f7c0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1f7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1f7e0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1f7f0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1f800 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1f810 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1f820 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1f830 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
1f840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
1f850 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
1f860 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
1f870 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1f880 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1f890 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f8a0 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
1f8b0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
1f8c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1f8d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1f8e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
1f8f0 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
1f900 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
1f910 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1f920 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
1f950 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
1f960 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1f970 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1f980 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f990 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f9a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f9b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f9c0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1f9d0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1f9e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f9f0 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
1fa00 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1fa10 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1fa20 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
1fa30 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1fa40 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d    nKey = (pPage-
1fa50 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69  >intKey ? 0 : (i
1fa60 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1fa70 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ey);..  if( NEVE
1fa80 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  R(offset+amt > n
1fa90 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1faa0 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50  Data) .   || &aP
1fab0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1fac0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1fad0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1fae0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1faf0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1fb00 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1fb10 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1fb20 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1fb30 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1fb40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fb50 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1fb60 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1fb70 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1fb80 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1fb90 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1fba0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1fbb0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1fbc0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1fbd0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1fbe0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1fbf0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1fc00 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1fc10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1fc20 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1fc30 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1fc40 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1fc50 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1fc60 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1fc70 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1fc80 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1fc90 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1fca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1fcb0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1fcc0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1fcd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fce0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1fcf0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1fd00 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1fd10 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1fd20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1fd30 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1fd40 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1fd50 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1fd60 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1fd70 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1fd80 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1fd90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1fda0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1fdb0 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1fdc0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1fdd0 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1fde0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1fdf0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1fe00 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1fe10 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1fe20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1fe30 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1fe40 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1fe50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1fe60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1fe70 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1fe80 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1fe90 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1fea0 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1feb0 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1fec0 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1fed0 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1fee0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1fef0 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1ff00 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1ff10 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1ff20 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1ff30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ff40 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1ff50 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1ff60 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1ff70 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1ff80 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1ff90 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1ffa0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1ffb0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1ffc0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1ffd0 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1ffe0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1fff0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
20000 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f  fl);.      /* nO
20010 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f  vfl is always po
20020 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77  sitive.  If it w
20030 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50  ere zero, fetchP
20040 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76  ayload would hav
20050 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  e.      ** been 
20060 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
20070 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
20080 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
20090 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75  S(nOvfl) && !pCu
200a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
200b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
200c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
200d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
200e0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
200f0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
20100 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
20110 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
20120 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
20130 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
20140 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
20150 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
20160 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
20170 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
20180 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
20190 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
201a0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
201b0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
201c0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
201d0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
201e0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
201f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
20200 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
20210 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
20220 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
20230 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
20240 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
20250 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
20260 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
20270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
20280 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
20290 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
202a0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
202b0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
202c0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
202d0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
202e0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
202f0 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
20300 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
20310 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
20320 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
20330 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
20340 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
20350 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
20360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
20370 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
20380 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
20390 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
203a0 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
203b0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
203c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
203d0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
203e0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
203f0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
20400 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
20410 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
20420 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
20430 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
20440 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
20450 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
20460 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
20470 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
20480 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
20490 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
204a0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
204b0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
204c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
204d0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
204e0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
204f0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
20500 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20510 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
20520 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
20530 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20540 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
20550 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
20560 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
20570 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
20580 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
20590 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
205a0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
205b0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
205c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
205d0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
205e0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
205f0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
20600 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
20610 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
20620 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
20630 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
20640 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
20650 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
20660 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
20670 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
20680 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
20690 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
206a0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
206b0 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
206c0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
206d0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
206e0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
206f0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
20700 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
20710 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
20720 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
20730 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
20740 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
20750 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
20760 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
20770 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
20780 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
20790 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
207a0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
207b0 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
207c0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
207d0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
207e0 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
207f0 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
20800 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
20810 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
20820 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
20830 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
20840 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
20850 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20860 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
20870 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  se,.        **. 
20880 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
20890 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20  ata can be read 
208a0 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
208b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
208c0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
208d0 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65   ** output buffe
208e0 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  r, bypassing the
208f0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f   page-cache alto
20900 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65  gether. This spe
20910 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  eds.        ** u
20920 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20  p loading large 
20930 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61  records that spa
20940 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  n many overflow 
20950 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  pages..        *
20960 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  /.        if( eO
20970 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  p==0            
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
209b0 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30      && offset==0
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
209f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
20a00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20a10 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
20a40 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
20a50 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
20a60 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
20a70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
20a80 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
20a90 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
20aa0 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20  Data[19]==0x01  
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
20ad0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20ae0 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
20af0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
20b00 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
20b10 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ];.          mem
20b20 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
20b30 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
20b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
20b50 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
20b60 61 2b 34 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  a+4, pBt->pageSi
20b70 7a 65 20 2a 20 28 6e 65 78 74 50 61 67 65 2d 31  ze * (nextPage-1
20b80 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
20b90 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
20ba0 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
20bb0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
20bc0 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
20bd0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
20be0 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
20bf0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
20c00 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
20c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20c20 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
20c30 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
20c40 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
20c50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20c70 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
20c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20c90 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
20ca0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
20cb0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
20cc0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
20cd0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
20ce0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
20cf0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
20d00 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
20d10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
20d20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20d30 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
20d40 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
20d50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
20d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20d70 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
20d80 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
20d90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20da0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
20db0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
20dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20dd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20de0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20df0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
20e00 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
20e10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20e20 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
20e30 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
20e40 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
20e50 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
20e60 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
20e70 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
20e80 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
20e90 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20ea0 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
20eb0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
20ec0 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
20ed0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
20ee0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20ef0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
20f00 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
20f10 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
20f20 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
20f30 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
20f40 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
20f50 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
20f60 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
20f70 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
20f80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
20f90 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
20fa0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
20fb0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
20fc0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
20fd0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20fe0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20ff0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21000 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21010 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21020 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
21030 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21040 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
21050 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21060 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
21070 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21080 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
21090 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
210a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
210b0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
210c0 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
210d0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
210e0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
210f0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
21100 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
21110 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
21120 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
21130 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
21140 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
21150 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
21160 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
21170 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21180 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
21190 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
211a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
211b0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
211c0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
211d0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
211e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
211f0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
21200 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
21210 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
21220 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
21230 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
21240 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
21250 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
21260 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21270 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
21280 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
21290 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
212a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
212b0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
212c0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
212d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
212e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
212f0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
21300 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
21310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21320 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
21330 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21340 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21360 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
21370 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21380 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
21390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
213a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
213b0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
213c0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
213d0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
213e0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
213f0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
21400 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
21410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21420 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
21430 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
21440 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
21450 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
21460 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
21470 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
21480 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
21490 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
214a0 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
214b0 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
214c0 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
214d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
214e0 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
214f0 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
21500 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
21510 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
21520 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
21530 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
21540 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
21550 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
21560 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
21570 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
21580 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
21590 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
215a0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
215b0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
215c0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
215d0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
215e0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
215f0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
21600 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
21610 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
21620 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
21630 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
21640 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
21650 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
21660 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
21670 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
21680 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
21690 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
216a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
216b0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
216c0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
216d0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
216e0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
216f0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
21700 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
21710 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
21720 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
21730 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
21740 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
21750 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
21760 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
21770 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
21780 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
21790 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
217a0 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
217b0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
217c0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
217d0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
217e0 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
217f0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
21800 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
21810 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
21820 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
21830 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
21840 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
21850 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
21860 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
21870 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
21880 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
21890 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
218a0 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
218b0 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
218c0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
218d0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
218e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
218f0 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
21900 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    u32 nLocal;.. 
21910 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
21920 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
21930 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
21940 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
21950 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21960 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21970 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
21980 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21990 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
219a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
219b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
219c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
219d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
219e0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
219f0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ll );.  if( NEVE
21a00 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  R(pCur->info.nSi
21a10 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74  ze==0) ){.    bt
21a20 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
21a30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21a40 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
21a50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21a70 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f       &pCur->info
21a80 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61  );.  }.  aPayloa
21a90 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
21aa0 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
21ab0 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
21ac0 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
21ad0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
21ae0 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
21af0 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
21b00 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
21b10 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
21b20 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
21b30 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
21b40 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
21b50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21b60 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
21b70 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
21b80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21b90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c  ;.    assert( nL
21ba0 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20  ocal<=nKey );.  
21bb0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
21bc0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
21bd0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
21be0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
21bf0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
21c00 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
21c10 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
21c20 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
21c30 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
21c40 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
21c50 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
21c60 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
21c70 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
21c80 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
21c90 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
21ca0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
21cb0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
21cc0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
21cd0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
21ce0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
21cf0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
21d00 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
21d10 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
21d20 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
21d30 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
21d40 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
21d50 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
21d60 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
21d70 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
21d80 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
21d90 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
21da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
21db0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
21dc0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
21dd0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
21de0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
21df0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
21e00 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
21e10 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
21e20 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
21e30 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
21e40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21e50 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
21e60 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
21e70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21e80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
21e90 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
21ea0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
21eb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21ec0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
21ed0 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
21ee0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21ef0 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
21f00 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
21f10 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
21f20 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
21f30 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e   return p;.}.con
21f40 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
21f50 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
21f60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21f70 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
21f80 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
21f90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21fa0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
21fb0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
21fc0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
21fd0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21fe0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
21ff0 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
22000 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22010 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
22020 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
22030 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
22040 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
22050 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
22060 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
22070 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
22080 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
22090 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
220a0 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
220b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
220c0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
220d0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
220e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
220f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
22100 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
22110 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
22120 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
22130 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
22140 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
22150 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
22160 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
22170 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
22180 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
22190 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
221a0 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
221b0 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
221c0 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
221d0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
221e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
221f0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
22200 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
22210 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
22220 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
22230 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
22240 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
22250 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
22260 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
22270 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
22280 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22290 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
222a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
222b0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
222c0 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20  _DEPTH );.  if( 
222d0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
222e0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
222f0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
22300 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22310 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
22320 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
22330 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
22340 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28  pNewPage);.  if(
22350 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
22360 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
22370 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b  i+1] = pNewPage;
22380 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  .  pCur->aiIdx[i
22390 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  +1] = 0;.  pCur-
223a0 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75  >iPage++;..  pCu
223b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
223c0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
223d0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
223e0 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
223f0 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
22400 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
22410 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
22420 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22430 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
22450 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
22460 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
22470 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
22480 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
22490 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
224a0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
224b0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
224c0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
224d0 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
224e0 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
224f0 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
22500 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
22510 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
22520 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
22530 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
22540 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
22550 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
22560 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
22570 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
22580 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
22590 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
225a0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
225b0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
225c0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
225d0 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
225e0 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
225f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
22600 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
22610 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
22620 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
22630 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
22640 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
22650 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
22660 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
22670 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
22680 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
22690 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
226a0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
226b0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
226c0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
226d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
226e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
226f0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
22700 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
22710 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
22720 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
22730 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
22740 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
22750 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
22760 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
22770 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
22780 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
22790 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
227a0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
227b0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
227c0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
227d0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
227e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
227f0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
22800 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
22810 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22820 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22840 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22850 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
22860 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
22870 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
22880 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22890 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
228a0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
228b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
228c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
228d0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
228e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
228f0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
22900 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22910 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72  ]->pgno.  );.  r
22920 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
22930 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22940 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
22950 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
22960 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22970 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
22980 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
22990 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
229a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
229b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
229c0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
229d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
229e0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
229f0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
22a00 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
22a10 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
22a20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
22a30 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
22a40 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
22a50 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
22a60 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
22a70 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
22a80 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
22a90 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
22aa0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
22ab0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
22ac0 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
22ad0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
22ae0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
22af0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
22b00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
22b10 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
22b20 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
22b30 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
22b40 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
22b50 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
22b60 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
22b70 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
22b80 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
22b90 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
22ba0 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
22bb0 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
22bc0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
22bd0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
22be0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
22bf0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
22c00 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
22c10 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
22c20 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
22c30 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
22c40 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
22c50 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
22c60 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
22c70 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
22c80 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
22c90 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
22ca0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
22cb0 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
22cc0 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
22cd0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
22ce0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
22cf0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
22d00 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
22d10 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
22d20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
22d30 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
22d40 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
22d50 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
22d60 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
22d70 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
22d80 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
22d90 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
22da0 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
22db0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
22dc0 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
22dd0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
22de0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
22df0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22e00 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
22e10 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
22e20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22e30 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
22e40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22e50 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22e60 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
22e70 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
22e80 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
22e90 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
22ea0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
22eb0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
22ec0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
22ed0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
22ee0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
22ef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
22f00 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
22f10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
22f20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22f30 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
22f40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
22f50 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
22f60 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
22f70 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
22f80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
22f90 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
22fa0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
22fb0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
22fc0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=0 ){.    int
22fd0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
22fe0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
22ff0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
23000 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
23010 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
23020 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
23030 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23040 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
23050 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
23060 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
23070 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
23080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
230a0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
230b0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
230c0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
230d0 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  age[0]);.    if(
230e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
230f0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
23100 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
23110 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
23120 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23130 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
23140 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  0;..    /* If pC
23150 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
23160 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
23170 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
23180 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
23190 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65  r.    ** expecte
231a0 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
231b0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
231c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
231d0 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a  KeyInfo is.    *
231e0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
231f0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
23200 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
23210 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
23220 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  se,.    ** retur
23230 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
23240 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20  UPT error.  */. 
23250 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23260 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
23270 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61  ey==1 || pCur->a
23280 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
23290 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
232a0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
232b0 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  0)!=pCur->apPage
232c0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
232d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
232e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
232f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23300 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
23310 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66   root page is of
23320 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
23330 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  e. This must be 
23340 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73  the.  ** case as
23350 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   the call to thi
23360 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
23370 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d  loaded the root-
23380 70 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a  page (either.  *
23390 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61  * this call or a
233a0 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61   previous invoca
233b0 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65  tion) would have
233c0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
233d0 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68  tion .  ** if th
233e0 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72  e assumption wer
233f0 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
23400 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
23410 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73  le for the flags
23420 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68   .  ** byte to h
23430 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
23440 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72  d while this cur
23450 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  sor is holding a
23460 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20   reference.  ** 
23470 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f  to the page.  */
23480 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
23490 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
234a0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
234b0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
234c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
234d0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20  Root->isInit && 
234e0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
234f0 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)==pRoot->intK
23500 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61  ey );..  pCur->a
23510 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
23520 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23530 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
23540 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
23550 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
23560 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
23570 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
23580 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
23590 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
235a0 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
235b0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
235c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
235d0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
235e0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
235f0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
23600 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
23610 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
23620 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
23630 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23640 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
23650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23660 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
23670 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
23680 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
23690 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
236a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
236b0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
236c0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
236d0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
236e0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
236f0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
23700 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
23710 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
23720 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
23730 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
23740 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
23750 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
23760 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
23770 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
23780 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
23790 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
237a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
237b0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
237c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
237d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
237e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
237f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23800 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23810 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23820 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23830 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23840 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
23850 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
23860 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
23870 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
23880 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23890 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
238a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
238b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
238c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
238d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
238e0 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
238f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
23900 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
23910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23920 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
23930 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
23940 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
23950 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
23960 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
23970 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
23980 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
23990 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
239a0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
239b0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
239c0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
239d0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
239e0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
239f0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
23a00 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
23a10 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
23a20 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
23a30 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
23a40 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
23a50 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
23a60 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
23a70 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
23a80 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
23a90 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
23aa0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
23ab0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
23ac0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
23ad0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
23ae0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
23af0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
23b00 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
23b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
23b20 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
23b30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
23b40 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23b50 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23b60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23b70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23b80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
23b90 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
23ba0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23bb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
23bc0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
23bd0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
23be0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
23bf0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
23c00 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23c10 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
23c20 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
23c30 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
23c40 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
23c50 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
23c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
23c70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23c80 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
23c90 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
23ca0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23cb0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
23cc0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
23cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23ce0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23cf0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
23d00 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
23d10 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
23d20 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
23d30 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
23d40 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
23d50 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
23d60 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
23d70 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
23d80 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
23d90 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
23da0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
23db0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
23dc0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
23dd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
23de0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23df0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23e00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23e10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
23e20 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
23e30 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
23e40 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
23e50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23e70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23e80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
23e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23ea0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
23eb0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
23ec0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
23ed0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
23ee0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
23ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
23f00 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23f10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
23f20 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
23f30 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
23f40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
23f50 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
23f60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
23f70 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
23f80 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
23f90 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
23fa0 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
23fb0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
23fc0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
23fd0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
23fe0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
23ff0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
24000 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
24010 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
24020 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
24030 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24040 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
24050 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
24060 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
24070 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
24080 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
24090 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
240a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
240b0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
240c0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
240d0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
240e0 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
240f0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
24100 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
24110 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
24120 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
24130 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72  ->eState && pCur
24140 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64  ->atLast ){.#ifd
24150 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24160 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
24170 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
24180 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
24190 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
241a0 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
241b0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
241c0 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
241d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
241e0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
241f0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
24200 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
24210 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
24220 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
24230 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
24240 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24250 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24260 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
24270 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24280 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
24290 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
242a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
242b0 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
242c0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
242d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
242e0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
242f0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
24300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24310 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
24320 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
24330 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
24340 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
24350 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
24360 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24370 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
24380 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
24390 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
243a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
243b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
243c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
243d0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
243e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
243f0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
24400 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
24410 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
24420 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d   ?1:0;.    }.  }
24430 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24440 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
24450 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
24460 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
24470 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
24480 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
24490 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
244a0 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
244b0 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
244c0 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
244d0 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
244e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
244f0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
24500 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
24510 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
24520 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
24530 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
24540 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
24550 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
24560 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
24570 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
24580 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
24590 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
245a0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
245b0 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
245c0 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
245d0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
245e0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
245f0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
24600 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
24610 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
24620 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
24630 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
24640 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
24650 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
24660 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
24670 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
24680 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
24690 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
246a0 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
246b0 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
246c0 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
246d0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
246e0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
246f0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
24700 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
24710 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
24720 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
24730 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
24740 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
24750 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
24760 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
24770 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
24780 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
24790 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
247a0 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
247b0 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
247c0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
247d0 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
247e0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
247f0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
24800 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
24820 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
24830 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
24840 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
24850 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
24860 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
24870 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
24880 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
24890 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
248a0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
248b0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
248c0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
248d0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
248e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
248f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
24900 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
24910 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
24920 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
24930 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
24940 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
24950 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
24960 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
24970 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
24980 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
24990 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
249a0 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
249b0 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
249c0 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
249d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
249e0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
249f0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
24a00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
24a10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24a20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24a30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24a40 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
24a50 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
24a60 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
24a70 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
24a80 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
24a90 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
24aa0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
24ab0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
24ac0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
24ad0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
24ae0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
24af0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
24b00 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
24b10 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
24b20 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
24b30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24b40 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
24b50 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20  r->validNKey .  
24b60 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
24b70 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
24b80 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
24b90 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
24ba0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
24bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
24bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
24be0 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72  ->atLast && pCur
24bf0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
24c00 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
24c10 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
24c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24c30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20      }.  }..  rc 
24c40 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
24c50 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
24c60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24c70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
24c80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24c90 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24ca0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
24cb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
24cc0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
24cd0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24ce0 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
24cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24d00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24d10 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
24d20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24d30 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
24d40 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
24d50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
24d60 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
24d70 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
24d80 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
24d90 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
24da0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24db0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
24dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24dd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
24de0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24df0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
24e00 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
24e10 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
24e20 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20  r, upr, idx;.   
24e30 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
24e40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24e50 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24e60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
24e70 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a    int c;..    /*
24e80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
24e90 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
24ea0 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
24eb0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
24ec0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
24ed0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
24ee0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
24ef0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
24f00 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
24f10 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
24f20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
24f30 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
24f40 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
24f50 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
24f60 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
24f70 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
24f80 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
24f90 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
24fa0 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
24fb0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
24fc0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
24fd0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
24fe0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
24ff0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
25000 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
25010 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
25020 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
25030 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
25040 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
25050 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25060 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
25070 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
25080 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
25090 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
250a0 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
250b0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
250c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
250d0 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78  age] = (u16)(idx
250e0 20 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c   = upr);.    }el
250f0 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
25100 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25110 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d  e] = (u16)(idx =
25120 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20   (upr+lwr)/2);. 
25130 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
25140 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
25150 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
25160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
25170 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
25180 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
25190 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
251a0 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49  ( idx==pCur->aiI
251b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
251c0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
251d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
251e0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
251f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
25200 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
25210 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  PtrSize;.      i
25220 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
25230 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
25240 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
25250 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
25260 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
25270 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
25280 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
25290 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
252a0 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
252b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
252c0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
252d0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
252e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
252f0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
25300 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
25310 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
25320 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
25330 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
25340 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
25350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25360 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
25370 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
25380 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
25390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
253a0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
253b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
253c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
253d0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d  CellKey;.      }
253e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
253f0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
25400 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
25410 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
25420 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
25430 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
25440 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
25450 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
25460 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
25470 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
25480 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
25490 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
254a0 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
254b0 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
254c0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
254d0 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
254e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
254f0 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
25500 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
25510 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
25520 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
25530 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
25540 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
25550 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
25560 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
25570 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
25580 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
25590 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
255a0 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
255b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
255c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
255d0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65   int nCell = pCe
255e0 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
255f0 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38  f( !(nCell & 0x8
25600 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  0).         && n
25610 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
25620 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 20 26  Local.         &
25630 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  & (pCell+nCell+1
25640 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  )<=pPage->aDataE
25650 6e 64 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  nd.        ){.  
25660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
25670 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
25680 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
25690 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
256a0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
256b0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
256c0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
256d0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
256e0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
256f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
25700 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
25710 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25720 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
25730 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
25740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
25750 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
25760 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
25770 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
25780 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
25790 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
257a0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
257b0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
257c0 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
257d0 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
257e0 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
257f0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
25800 20 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c    && (pCell+nCel
25810 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61  l+2)<=pPage->aDa
25820 74 61 45 6e 64 0a 20 20 20 20 20 20 20 20 29 7b  taEnd.        ){
25830 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
25840 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
25850 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
25860 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
25870 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
25880 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
25890 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
258a0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
258b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
258c0 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
258d0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
258e0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
258f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
25900 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
25910 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
25920 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
25930 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
25950 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
25960 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
25970 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
25980 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
25990 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
259a0 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
259b0 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
259c0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
259d0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
259e0 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
259f0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
25a00 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
25a10 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
25a20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
25a30 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
25a40 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
25a50 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
25a60 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
25a70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
25a80 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
25a90 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
25aa0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
25ab0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
25ac0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
25ad0 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
25ae0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
25af0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
25b00 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
25b10 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
25b20 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
25b30 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
25b40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25b50 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
25b60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25b80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
25b90 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
25ba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25bb0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
25bc0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
25bd0 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
25be0 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
25bf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
25c00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
25c10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25c20 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
25c30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
25c40 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
25c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25c60 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
25c70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25c80 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
25c90 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
25ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25cb0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
25cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25cd0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
25ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
25cf0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
25d00 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25d10 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
25d20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  x;.          bre
25d30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
25d40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
25d50 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
25d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25d70 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25d80 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25da0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
25db0 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
25dc0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
25dd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
25de0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
25df0 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
25e00 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
25e10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25e20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25e30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
25e40 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72 2b  u16)(idx = (lwr+
25e50 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
25e60 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
25e70 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
25e80 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
25e90 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
25ea0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
25eb0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
25ec0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
25ed0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
25ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25ef0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
25f00 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
25f10 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
25f20 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
25f30 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
25f40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25f50 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
25f60 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
25f70 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
25f80 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
25f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
25fa0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25fb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
25fc0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25fd0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
25fe0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
25ff0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
26000 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
26010 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
26020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
26030 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26040 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
26050 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
26060 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
26070 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
26080 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
26090 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
260a0 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
260b0 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
260c0 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
260d0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
260e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
260f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
26100 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
26110 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
26120 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
26130 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
26140 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
26150 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
26160 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
26170 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
26180 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
26190 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
261a0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
261b0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
261c0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
261d0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
261e0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
261f0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
26200 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
26210 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
26220 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
26230 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
26240 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
26250 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
26260 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
26270 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
26280 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
26290 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
262a0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
262b0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
262c0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
262d0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
262e0 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
262f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
26300 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
26310 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
26320 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
26330 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
26340 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
26350 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
26360 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
26370 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
26380 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
26390 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
263a0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
263b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
263c0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
263d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
263e0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
263f0 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
26400 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
26410 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
26420 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
26430 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
26440 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
26450 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
26460 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26470 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
26480 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
26490 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
264a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
264b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
264c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
264d0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
264e0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
264f0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
26500 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
26510 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
26520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
26530 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
26540 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  xt>0 ){.    pCur
26550 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
26560 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26570 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26580 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
26590 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a  >skipNext = 0;..
265a0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
265b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
265c0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
265d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
265e0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
265f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
26600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
26610 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
26620 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
26630 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
26640 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
26650 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
26660 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
26670 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
26680 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
26690 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
266a0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
266b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
266c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
266d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
266e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
266f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
26700 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
26710 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26720 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26730 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
26740 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
26750 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26760 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
26770 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
26780 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
26790 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
267a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
267b0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
267c0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
267d0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
267e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
267f0 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
26800 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
26810 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
26820 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
26830 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
26840 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26850 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
26860 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
26870 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
26880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
26890 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
268a0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
268b0 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
268c0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
268d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
268e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
268f0 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
26900 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
26910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26920 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
26930 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
26940 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
26950 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
26960 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
26970 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
26980 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
26990 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
269a0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
269b0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
269c0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
269d0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
269e0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
269f0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
26a00 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
26a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26a20 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
26a30 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
26a40 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
26a50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26a60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26a70 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26a80 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
26a90 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
26aa0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
26ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
26ad0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
26ae0 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
26af0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
26b00 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
26b10 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
26b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26b30 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
26b40 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
26b50 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
26b60 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
26b70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
26b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26b90 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
26ba0 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
26bb0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26bc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26bd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26be0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
26bf0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
26c00 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
26c10 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26c20 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
26c30 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
26c40 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
26c50 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
26c60 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
26c70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
26c80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
26c90 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
26ca0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
26cb0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
26cc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26cd0 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
26ce0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
26cf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26d00 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
26d10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
26d20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
26d30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26d50 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
26d60 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
26d70 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
26d80 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26d90 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
26da0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
26db0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26dc0 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
26dd0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26de0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26df0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
26e00 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
26e10 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
26e20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
26e30 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
26e40 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
26e50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26e60 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
26e70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
26e80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26e90 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
26ea0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
26eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26ec0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
26ed0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
26ee0 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
26ef0 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
26f00 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
26f10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26f20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
26f30 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
26f40 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
26f50 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
26f60 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
26f70 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
26f80 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
26f90 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
26fa0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
26fb0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
26fc0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
26fd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26fe0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
26ff0 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
27000 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
27010 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
27020 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
27030 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
27040 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
27050 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
27060 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
27070 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
27080 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
27090 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
270a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
270b0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
270c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
270d0 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
270e0 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
270f0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
27100 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
27110 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
27120 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
27130 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
27140 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
27150 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
27160 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
27170 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
27180 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
27190 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
271a0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
271b0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
271c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
271d0 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
271e0 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
271f0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
27200 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
27210 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
27220 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
27230 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
27240 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
27250 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
27260 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
27270 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
27280 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
27290 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
272a0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
272b0 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
272c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
272d0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
272e0 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
272f0 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
27300 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
27310 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27320 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
27330 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
27340 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
27350 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
27360 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
27370 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
27380 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
27390 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
273a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
273b0 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
273c0 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
273d0 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
273e0 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
273f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
27400 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
27410 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27420 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
27430 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
27440 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
27450 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
27460 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
27470 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
27480 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27490 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
274a0 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
274b0 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
274c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
274d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
274e0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
274f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
27500 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
27510 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
27520 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
27530 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
27540 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
27550 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
27560 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
27570 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
27580 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
27590 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
275a0 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
275b0 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
275c0 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
275d0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
275e0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
275f0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
27600 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
27610 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
27620 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
27630 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
27640 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
27650 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
27660 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
27670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27680 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
27690 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
276a0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
276b0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
276c0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
276d0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
276e0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
276f0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
27700 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
27710 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
27720 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
27730 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27740 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
27750 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
27760 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
27770 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
27780 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
27790 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
277a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
277b0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
277c0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
277d0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
277e0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
277f0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
27800 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
27810 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
27820 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
27830 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27840 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27850 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
27860 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
27870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27880 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
27890 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
278a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
278b0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
278c0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
278d0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
278e0 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
278f0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
27900 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
27910 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
27920 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
27930 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
27940 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
27950 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
27960 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
27970 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
27980 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
27990 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
279a0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
279b0 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
279c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
279d0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
279e0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
279f0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
27a00 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
27a10 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
27a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
27a30 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
27a40 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
27a50 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
27a60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
27a70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
27a80 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
27a90 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
27aa0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
27ab0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
27ac0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
27ad0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27ae0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
27af0 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
27b00 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
27b10 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
27b20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
27b30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
27b40 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
27b50 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ta!=0 );..      
27b60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
27b70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
27b80 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
27b90 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
27ba0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
27bb0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
27bc0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
27bd0 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
27be0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
27bf0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
27c00 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
27c10 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
27c20 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
27c30 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
27c40 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
27c50 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
27c60 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
27c70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27c80 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
27c90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27ca0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27cb0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27cc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27cd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27ce0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27cf0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27d00 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
27d10 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
27d20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
27d30 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
27d40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
27d50 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
27d60 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
27d70 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
27d80 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
27d90 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
27da0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
27db0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
27dc0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
27dd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
27de0 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
27df0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
27e00 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
27e10 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
27e20 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
27e30 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
27e40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27e50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27e60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27e70 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27e80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27e90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27ea0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
27eb0 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
27ec0 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
27ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
27ee0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
27ef0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
27f00 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
27f10 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
27f20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
27f30 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
27f40 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
27f50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27f60 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
27f70 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
27f80 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
27f90 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
27fa0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
27fb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27fc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27fd0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
27fe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
27ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
28000 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
28010 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
28020 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
28030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
28040 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
28050 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
28060 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
28070 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
28080 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
28090 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
280a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
280b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
280c0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
280d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
280e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
280f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
28110 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
28120 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28130 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28140 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
28150 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
28160 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
28170 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28190 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
281a0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
281b0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
281c0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
281d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
281e0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
281f0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
28200 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
28210 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
28220 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
28230 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
28240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28250 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
28260 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
28270 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
28280 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
28290 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
282a0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
282b0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
282c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
282d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
282e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
282f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
28300 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
28310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28320 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
28330 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
28340 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
28350 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
28360 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
28370 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
28380 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
283a0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
283b0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
283c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
283d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
283e0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
283f0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
28400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28420 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
28430 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
28440 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
28450 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
28460 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
28470 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
28480 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
28490 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
284a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
284b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
284c0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
284d0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
284e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
284f0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
28500 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
28510 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
28520 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
28530 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
28540 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
28550 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
28560 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
28570 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28580 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28590 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
285a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
285b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
285c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
285d0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
285e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
285f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28600 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28610 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
28620 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28630 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28640 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
28650 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
28660 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28670 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28680 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
28690 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
286a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
286b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
286c0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
286d0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
286e0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
286f0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
28700 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
28710 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
28720 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
28730 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
28740 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
28750 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
28760 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
28770 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
28780 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
28790 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
287a0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
287b0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
287c0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
287d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
287e0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
287f0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
28800 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
28810 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
28820 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
28830 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
28840 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
28850 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
28860 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
28870 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
28880 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
28890 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
288a0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
288b0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
288c0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
288d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
288e0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
288f0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
28900 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
28910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
28920 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28930 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
28940 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
28950 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
28960 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
28970 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
28980 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28990 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
289a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
289b0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
289c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
289d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
289e0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
289f0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28a00 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
28a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28a20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
28a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
28a40 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
28a50 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
28a60 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
28a70 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
28a80 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
28a90 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
28aa0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
28ab0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
28ac0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28ae0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
28af0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
28b00 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
28b10 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
28b20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
28b30 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
28b40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28b50 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
28b60 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28b70 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28b80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
28b90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
28ba0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
28bc0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
28bd0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
28be0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
28bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28c00 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
28c10 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
28c20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
28c30 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
28c40 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
28c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28c60 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28c70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
28c80 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
28c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28cb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28cc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28cd0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
28ce0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28cf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28d10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28d20 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
28d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28d50 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
28d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d70 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
28d80 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
28d90 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
28da0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
28db0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
28dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
28dd0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
28de0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
28df0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
28e00 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
28e10 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
28e20 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
28e30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28e40 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
28e50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
28e60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28e70 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
28e80 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
28e90 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
28ea0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28eb0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
28ec0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28ed0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28ee0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
28ef0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
28f00 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
28f10 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
28f20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
28f30 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
28f40 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
28f50 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
28f60 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
28f70 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
28f80 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
28f90 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
28fa0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
28fb0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
28fc0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
28fd0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
28fe0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
28ff0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
29000 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
29010 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
29020 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
29030 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
29040 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
29050 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
29060 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
29070 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
29080 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
29090 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
290a0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
290b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
290c0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
290d0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
290e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
290f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29100 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
29110 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
29120 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29130 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
29140 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
29150 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
29160 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
29170 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
29180 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
29190 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
291a0 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
291b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
291c0 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
291d0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
291e0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
291f0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
29200 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
29210 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
29220 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
29230 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
29240 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
29250 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
29260 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  age, 1);.    if(
29270 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29280 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
29290 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
292a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
292b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
292c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
292d0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
292e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
292f0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
29300 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
29310 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
29320 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
29330 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
29340 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
29350 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
29360 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
29370 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
29380 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
29390 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
293a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
293b0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
293c0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
293d0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
293e0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
293f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
29400 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
29410 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29420 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
29430 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
29440 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
29450 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
29460 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
29470 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
29480 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
29490 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
294a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
294b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
294c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
294d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
294e0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
294f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29500 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
29510 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
29520 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
29530 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29540 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
29550 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
29560 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
29570 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
29580 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
29590 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
295a0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
295b0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
295c0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
295d0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
295e0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
295f0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
29600 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
29610 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
29620 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
29630 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
29640 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
29650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
29660 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
29670 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
29680 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
29690 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
296a0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
296b0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
296c0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
296d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
296e0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
296f0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
29700 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
29710 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
29720 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
29750 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
29760 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29780 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29790 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
297a0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
297b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
297c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
297d0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
297e0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
297f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
29800 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
29810 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
29820 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
29830 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
29840 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
29870 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
29880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
298a0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
298b0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
298c0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
298d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
298e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
298f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
29900 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
29910 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
29920 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
29930 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
29940 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
29950 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
29960 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
29970 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
29980 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
29990 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
299a0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
299b0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
299c0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
299d0 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
299e0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
299f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29a00 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
29a10 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
29a20 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
29a30 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
29a40 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
29a50 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
29a60 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
29a70 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
29a80 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
29a90 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
29aa0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
29ab0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
29ac0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
29ad0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
29ae0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
29af0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
29b00 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
29b10 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
29b20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
29b30 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
29b40 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
29b50 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
29b60 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
29b70 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
29b80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29b90 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
29ba0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
29bb0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
29bd0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
29be0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
29bf0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
29c00 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
29c10 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
29c20 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
29c30 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
29c40 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
29c50 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
29c60 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
29c70 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
29c80 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29c90 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
29ca0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
29cb0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
29cc0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
29cd0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29ce0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
29cf0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
29d00 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
29d10 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
29d20 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
29d30 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
29d40 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
29d50 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
29d60 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
29d70 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
29d80 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
29d90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
29da0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
29db0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
29dc0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
29dd0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
29de0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
29df0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
29e00 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
29e10 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
29e20 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
29e30 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
29e40 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
29e50 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
29e60 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
29e70 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
29e80 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
29e90 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
29ea0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
29eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29ec0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
29ed0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
29ee0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
29ef0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
29f00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
29f10 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
29f20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
29f30 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
29f40 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
29f50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
29f70 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29f80 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
29f90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
29fa0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
29fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
29fc0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
29fd0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
29fe0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
29ff0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2a000 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a010 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a020 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2a030 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2a040 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2a050 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2a060 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2a070 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2a080 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2a090 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2a0a0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2a0b0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2a0c0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2a0d0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2a0e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2a0f0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2a100 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2a110 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2a120 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2a130 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2a140 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2a150 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2a160 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2a170 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2a180 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2a190 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2a1a0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2a1b0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2a1c0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2a1d0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2a1e0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2a1f0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2a200 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2a210 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2a220 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2a230 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2a240 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2a250 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2a260 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2a270 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2a280 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2a290 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2a2a0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2a2b0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2a2c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2a2d0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2a2e0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2a2f0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2a300 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2a310 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2a320 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2a330 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2a340 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2a350 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2a360 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2a370 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2a380 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2a390 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2a3a0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2a3b0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2a3c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2a3d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a3e0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2a3f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2a400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a410 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2a420 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2a430 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2a440 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2a450 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2a460 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2a470 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2a480 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e   pPage && !pBt->
2a490 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
2a4a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a4b0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a4c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2a4d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a4e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2a4f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2a500 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2a510 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2a520 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2a530 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2a540 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2a550 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2a560 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2a570 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2a580 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2a590 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2a5a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2a5b0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2a5c0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2a5d0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2a5e0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2a5f0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2a600 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2a610 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2a620 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2a630 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2a640 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2a650 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2a660 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2a670 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2a680 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2a690 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2a6a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2a6b0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2a6c0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2a6d0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2a6e0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2a6f0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2a700 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2a710 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2a720 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2a730 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2a740 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a750 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2a760 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a770 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2a780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a790 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2a7a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2a7b0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2a7c0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2a7d0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2a7e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2a7f0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2a800 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2a810 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2a820 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2a830 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2a840 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2a850 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2a860 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2a870 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2a880 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2a890 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2a8a0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2a8b0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2a8c0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2a8d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a8e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2a8f0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2a900 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2a910 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2a920 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2a930 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2a940 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2a950 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2a960 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2a970 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2a980 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2a990 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2a9a0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
2a9b0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
2a9c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
2a9d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2a9e0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
2a9f0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2aa00 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2aa10 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2aa20 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2aa30 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2aa40 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2aa50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2aa60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2aa70 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2aa80 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2aa90 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2aaa0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2aab0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2aac0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
2aad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
2aae0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
2aaf0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
2ab00 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
2ab10 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2ab20 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
2ab30 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
2ab40 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
2ab50 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
2ab60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2ab70 55 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  UPT;  /* Cell ex
2ab80 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2ab90 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2aba0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2abb0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2abc0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2abd0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2abe0 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2abf0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2ac00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2ac10 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2ac20 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2ac30 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2ac40 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2ac50 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2ac60 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2ac70 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2ac80 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2ac90 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2aca0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2acb0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2acc0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2acd0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2ace0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2acf0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2ad00 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2ad10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2ad20 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2ad30 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2ad40 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2ad50 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2ad60 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2ad70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2ad80 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2ad90 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2ada0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2adb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2adc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2add0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2ade0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2adf0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2ae00 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2ae10 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2ae20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2ae30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ae40 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2ae50 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2ae60 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2ae70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2ae80 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2ae90 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2aea0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2aeb0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2aec0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2aed0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2aee0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2aef0 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2af00 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2af10 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2af20 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2af30 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2af40 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2af50 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2af60 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2af70 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2af80 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2af90 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2afa0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2afb0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2afc0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2afd0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2afe0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2aff0 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2b000 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2b010 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2b020 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2b030 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2b040 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2b050 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2b060 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2b070 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2b080 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2b090 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2b0a0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2b0b0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2b0c0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2b0d0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2b0e0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2b0f0 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2b100 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2b110 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2b120 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2b130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2b150 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2b160 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2b170 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2b180 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2b190 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2b1a0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2b1b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b1c0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2b1d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b1e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b1f0 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2b200 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2b210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b220 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2b230 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2b240 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2b250 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2b260 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2b270 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2b280 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2b290 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2b2a0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2b2b0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2b2c0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2b2d0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2b2e0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2b2f0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2b300 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2b310 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2b320 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2b330 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2b340 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b350 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2b360 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2b370 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2b380 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2b390 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2b3a0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2b3b0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2b3c0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2b3d0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2b3e0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2b3f0 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2b400 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2b410 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2b420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b430 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2b440 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2b450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b460 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2b470 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2b480 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2b490 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2b4a0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2b4b0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2b4c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2b4d0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2b4e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2b4f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2b500 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2b510 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2b520 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b540 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2b550 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2b560 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2b570 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b590 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2b5a0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2b5b0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2b5c0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2b5d0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2b5e0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2b5f0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2b600 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2b610 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2b620 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2b630 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2b640 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2b650 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2b660 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2b670 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2b680 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2b690 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2b6a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2b6b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b6c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2b6d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2b6e0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2b6f0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2b700 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2b710 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2b720 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2b730 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2b740 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2b750 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2b760 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2b770 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2b780 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2b790 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2b7a0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2b7b0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2b7c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b7d0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2b7e0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2b7f0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2b800 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2b810 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2b820 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2b830 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2b840 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2b850 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2b860 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2b870 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2b880 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
2b890 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
2b8a0 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
2b8b0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
2b8c0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2b8d0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
2b8e0 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
2b8f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2b900 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2b910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2b920 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
2b930 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2b940 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2b950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2b960 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
2b970 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
2b980 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2b990 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
2b9a0 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
2b9b0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
2b9c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2b9d0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2b9e0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2b9f0 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2ba00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2ba10 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2ba20 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2ba30 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2ba40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2ba50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2ba60 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2ba70 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
2ba80 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2ba90 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2baa0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
2bab0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
2bac0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
2bad0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
2bae0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
2baf0 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
2bb00 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
2bb10 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
2bb20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2bb30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2bb40 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2bb50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2bb60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2bb70 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2bb80 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2bb90 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2bba0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2bbb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2bbc0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2bbd0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2bbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2bbf0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2bc00 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2bc10 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2bc20 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2bc30 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2bc40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2bc50 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2bc60 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2bc70 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2bc80 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2bc90 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2bca0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2bcb0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2bcc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2bcd0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2bce0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2bcf0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2bd00 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2bd10 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2bd20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2bd30 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2bd40 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2bd50 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2bd60 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2bd70 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2bd80 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2bd90 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2bda0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2bdb0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2bdc0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2bdd0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2bde0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2bdf0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2be00 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2be10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2be20 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2be30 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2be40 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2be50 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2be60 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2be70 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2be80 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2be90 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
2bea0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2beb0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2bec0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2bed0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2bee0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2bef0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2bf00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bf10 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2bf20 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2bf30 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2bf40 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2bf50 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2bf60 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2bf70 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2bf80 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2bf90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2bfa0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2bfb0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2bfc0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2bfd0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2bfe0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2bff0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2c000 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c010 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2c020 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2c030 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2c040 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2c050 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2c060 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2c070 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2c080 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2c090 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2c0a0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2c0b0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2c0c0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2c0d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2c0e0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2c0f0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2c100 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2c110 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2c120 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2c130 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2c140 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2c150 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c160 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2c170 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2c180 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2c190 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2c1a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2c1b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2c1c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c1d0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2c1e0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2c1f0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2c200 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2c210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c220 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2c230 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2c240 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2c250 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2c260 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2c270 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2c280 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2c290 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2c2a0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2c2b0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2c2c0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2c2d0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2c2e0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2c2f0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2c300 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2c310 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2c320 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2c330 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2c340 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2c350 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2c360 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2c370 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2c380 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2c390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2c3a0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2c3b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c3c0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2c3d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2c3e0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2c3f0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2c400 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2c410 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2c420 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2c430 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2c440 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2c450 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2c460 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2c470 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2c480 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2c490 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2c4a0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2c4b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c4c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2c4d0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2c4e0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2c4f0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2c500 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2c510 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2c520 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2c530 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2c540 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2c550 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2c560 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2c570 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2c580 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2c590 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2c5a0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2c5b0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2c5c0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2c5d0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2c5e0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2c5f0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2c600 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c610 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2c620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c630 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2c640 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2c650 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2c660 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2c670 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2c680 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2c690 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2c6a0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2c6b0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2c6c0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2c6d0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2c6e0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2c6f0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2c700 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2c710 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2c720 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2c730 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2c740 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2c750 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c760 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2c770 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2c780 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2c790 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2c7a0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2c7b0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
2c7c0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2c7d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2c7e0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2c7f0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2c800 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2c810 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2c820 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2c830 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2c840 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2c850 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2c860 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45  endPtr;     /* E
2c870 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  nd of loop */.  
2c880 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2c890 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2c8a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
2c8b0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2c8c0 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
2c8d0 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
2c8e0 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
2c8f0 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
2c900 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2c910 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2c920 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2c930 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2c940 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
2c950 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
2c960 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c970 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c980 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2c990 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c9a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2c9b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c9c0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2c9d0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
2c9e0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
2c9f0 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
2ca00 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
2ca10 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2ca20 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
2ca30 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
2ca40 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
2ca50 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
2ca60 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
2ca70 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2ca80 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
2ca90 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2caa0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2cab0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2cac0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2cad0 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2cae0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2caf0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2cb00 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2cb10 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2cb20 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2cb30 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2cb40 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d  ;.  }.  endPtr =
2cb50 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2cb60 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x[2*pPage->nCell
2cb70 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28   - 2];.  assert(
2cb80 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2cb90 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2cba0 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2cbb0 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2cbc0 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ed */.  while( p
2cbd0 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20  tr<endPtr ){.   
2cbe0 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28   *(u16*)ptr = *(
2cbf0 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20  u16*)&ptr[2];.  
2cc00 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a    ptr += 2;.  }.
2cc10 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
2cc20 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2cc30 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
2cc40 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
2cc50 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d  e->nFree += 2;.}
2cc60 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2cc70 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
2cc80 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
2cc90 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
2cca0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
2ccb0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
2ccc0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2ccd0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
2cce0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
2ccf0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
2cd00 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
2cd10 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
2cd20 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
2cd30 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2cd40 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
2cd50 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
2cd60 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
2cd70 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
2cd80 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
2cd90 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
2cda0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2cdb0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2cdc0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2cdd0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2cde0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2cdf0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2ce00 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2ce10 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2ce20 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2ce30 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2ce40 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2ce50 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2ce60 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2ce70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2ce80 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2ce90 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2cea0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2ceb0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2cec0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2ced0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2cee0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2cef0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2cf00 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2cf10 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2cf20 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2cf30 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2cf40 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2cf50 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2cf60 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2cf70 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2cf80 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2cf90 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2cfa0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2cfb0 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2cfc0 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2cfd0 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2cfe0 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2cff0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2d000 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2d010 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2d020 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2d030 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2d040 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2d050 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2d060 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2d070 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2d080 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2d090 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2d0a0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2d0b0 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2d0c0 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2d0d0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2d0e0 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2d0f0 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2d100 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2d110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2d120 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2d130 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2d140 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2d150 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2d160 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2d170 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2d180 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2d190 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2d1a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2d1b0 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2d1c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d1d0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2d1e0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2d1f0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2d200 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2d210 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2d220 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2d230 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2d240 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2d250 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2d260 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2d270 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2d280 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2d290 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2d2a0 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2d2b0 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2d2c0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
2d2d0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2d2e0 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
2d2f0 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
2d300 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2d310 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f  *endPtr;       /
2d320 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2d330 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69  p */..  int nSki
2d340 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
2d350 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
2d360 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2d370 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2d380 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
2d390 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2d3a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d3b0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
2d3c0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2d3d0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2d3e0 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
2d3f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d400 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2d410 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
2d420 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
2d430 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d440 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2d450 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
2d460 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
2d470 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
2d480 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
2d490 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
2d4a0 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
2d4b0 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
2d4c0 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
2d4d0 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
2d4e0 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
2d4f0 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
2d500 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
2d510 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
2d520 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
2d530 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
2d540 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
2d550 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
2d560 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
2d570 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
2d580 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
2d590 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
2d5a0 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
2d5b0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
2d5c0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
2d5d0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2d5e0 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
2d5f0 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
2d600 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2d610 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
2d620 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
2d630 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
2d640 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2d650 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
2d660 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2d670 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
2d680 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
2d690 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
2d6a0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2d6b0 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
2d6c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
2d6d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d6e0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2d6f0 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
2d700 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
2d710 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
2d720 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
2d730 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
2d740 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
2d750 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
2d760 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  idx = (u16)i;.  
2d770 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
2d780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d790 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2d7a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2d7b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d7c0 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
2d7d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
2d7e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2d7f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d800 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2d810 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2d820 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2d830 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
2d840 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
2d850 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
2d860 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2d870 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
2d880 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
2d890 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
2d8a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
2d8b0 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
2d8c0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
2d8d0 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
2d8e0 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
2d8f0 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
2d900 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
2d910 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
2d920 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69  ing two properti
2d930 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
2d940 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20  returns success 
2d950 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
2d960 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20  dx >= end+2 );. 
2d970 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
2d980 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
2d990 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2d9a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
2d9b0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
2d9c0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
2d9d0 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
2d9e0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
2d9f0 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
2da00 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2da10 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2da20 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2da30 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
2da40 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2da50 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d  ptr = &data[end]
2da60 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26  ;.    endPtr = &
2da70 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61  data[ins];.    a
2da80 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50  ssert( (SQLITE_P
2da90 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31  TR_TO_INT(ptr)&1
2daa0 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20  )==0 );  /* ptr 
2dab0 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65  is always 2-byte
2dac0 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20   aligned */.    
2dad0 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74  while( ptr>endPt
2dae0 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36  r ){.      *(u16
2daf0 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26  *)ptr = *(u16*)&
2db00 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
2db10 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  tr -= 2;.    }. 
2db20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2db30 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
2db40 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2db50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2db60 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
2db70 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2db80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2db90 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2dba0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
2dbb0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
2dbc0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
2dbd0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
2dbe0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2dbf0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
2dc00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2dc10 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2dc20 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
2dc30 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
2dc40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
2dc50 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2dc60 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
2dc70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2dc80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2dc90 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
2dca0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
2dcb0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
2dcc0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
2dcd0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
2dce0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
2dcf0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
2dd00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2dd10 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
2dd20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2dd30 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
2dd40 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
2dd50 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
2dd60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
2dd70 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
2dd80 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
2dd90 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2dda0 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
2ddb0 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
2ddc0 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
2ddd0 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
2dde0 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
2ddf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2de00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2de10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
2de20 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
2de30 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2de40 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
2de50 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
2de60 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
2de70 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2de80 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
2de90 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
2dea0 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
2deb0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2dec0 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
2ded0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2dee0 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
2def0 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
2df00 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2df10 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
2df20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2df30 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
2df40 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2df50 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
2df60 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
2df70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2df80 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2df90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2dfa0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2dfb0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2dfc0 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
2dfd0 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69  >=0 && nCell<=(i
2dfe0 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
2dff0 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20  ->pBt).         
2e000 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45     && (int)MX_CE
2e010 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2e020 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74  10921);.  assert
2e030 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2e040 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2e050 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2e060 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2e070 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2e080 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2e090 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2e0a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2e0b0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2e0c0 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  rt( get2byteNotZ
2e0d0 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
2e0e0 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
2e0f0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61   pCellptr = &pPa
2e100 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  ge->aCellIdx[nCe
2e110 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2e120 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2e130 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2e140 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31  =0; i--){.    u1
2e150 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b  6 sz = aSize[i];
2e160 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
2e170 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
2e180 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32   -= sz;.    put2
2e190 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
2e1a0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
2e1b0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
2e1c0 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
2e1d0 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32   sz);.  }.  put2
2e1e0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2e1f0 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  ], nCell);.  put
2e200 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2e210 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  5], cellbody);. 
2e220 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2e230 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61   (nCell*2 + nUsa
2e240 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b  ble - cellbody);
2e250 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
2e260 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
2e270 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2e280 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
2e290 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
2e2a0 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
2e2b0 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
2e2c0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
2e2d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
2e2e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2e2f0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2e300 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
2e310 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
2e320 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2e330 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2e340 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
2e350 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
2e360 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
2e370 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
2e380 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
2e390 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
2e3a0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2e3b0 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
2e3c0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
2e3d0 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
2e3e0 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
2e3f0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
2e400 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
2e410 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
2e420 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
2e430 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
2e440 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2e450 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
2e460 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
2e470 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
2e480 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
2e490 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
2e4a0 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
2e4b0 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
2e4c0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
2e4d0 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
2e4e0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
2e4f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
2e500 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2e510 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
2e520 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
2e530 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
2e540 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
2e550 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
2e560 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
2e570 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2e580 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
2e590 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
2e5a0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
2e5b0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
2e5c0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
2e5d0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
2e5e0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
2e5f0 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
2e600 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
2e610 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
2e620 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
2e630 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
2e640 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
2e650 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
2e660 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
2e670 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
2e680 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  to balance the 3
2e690 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2e6a0 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
2e6b0 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
2e6c0 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
2e6d0 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
2e6e0 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
2e6f0 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
2e700 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
2e710 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
2e720 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
2e730 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
2e740 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
2e750 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
2e760 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
2e770 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
2e780 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
2e790 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
2e7a0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
2e7b0 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
2e7c0 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
2e7d0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
2e7e0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
2e7f0 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
2e800 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
2e810 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
2e820 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
2e830 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
2e840 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
2e850 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
2e860 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
2e870 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2e880 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
2e890 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
2e8a0 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
2e8b0 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
2e8c0 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
2e8d0 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
2e8e0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
2e8f0 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
2e900 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
2e910 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
2e920 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
2e930 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
2e940 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2e950 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
2e960 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
2e970 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
2e980 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
2e990 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
2e9a0 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
2e9b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
2e9c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2e9d0 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
2e9e0 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
2e9f0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
2ea00 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
2ea10 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
2ea20 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
2ea30 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
2ea40 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
2ea50 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea70 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
2ea80 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2ea90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eab0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2eac0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2eaf0 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
2eb00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2eb10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2eb20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2eb30 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2eb40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2eb50 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2eb60 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2eb70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2eb80 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
2eb90 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63   /* This error c
2eba0 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20  ondition is now 
2ebb0 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
2ebc0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75  reaching this fu
2ebd0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
2ebe0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20  pPage->nCell<=0 
2ebf0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ec00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
2ec10 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
2ec20 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
2ec30 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
2ec40 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
2ec50 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
2ec60 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
2ec70 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
2ec80 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
2ec90 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
2eca0 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
2ecb0 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
2ecc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2ecd0 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
2ece0 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
2ecf0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2ed00 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
2ed10 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
2ed20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ed30 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
2ed40 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
2ed50 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
2ed60 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
2ed70 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75  [0].pCell;.    u
2ed80 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
2ed90 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2eda0 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
2edb0 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
2edc0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2edd0 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
2ede0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2edf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ee00 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
2ee10 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2ee20 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
2ee30 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
2ee40 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
2ee50 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2ee60 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
2ee70 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
2ee80 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
2ee90 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2eea0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2eeb0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2eec0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2eed0 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
2eee0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
2eef0 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
2ef00 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
2ef10 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
2ef20 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
2ef30 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2ef40 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
2ef50 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
2ef60 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
2ef70 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
2ef80 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
2ef90 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
2efa0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2efb0 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
2efc0 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
2efd0 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
2efe0 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
2eff0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
2f000 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
2f010 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
2f020 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
2f030 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
2f040 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
2f050 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
2f060 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
2f070 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
2f080 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
2f090 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2f0a0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2f0b0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
2f0c0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2f0d0 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
2f0e0 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2f0f0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
2f100 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
2f110 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
2f120 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
2f130 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
2f140 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
2f150 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2f160 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
2f170 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
2f180 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
2f190 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
2f1a0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
2f1b0 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
2f1c0 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
2f1d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
2f1e0 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
2f1f0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2f200 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
2f210 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
2f220 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
2f230 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
2f240 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
2f250 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
2f260 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
2f270 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
2f280 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
2f290 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
2f2a0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
2f2b0 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
2f2c0 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
2f2d0 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
2f2e0 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
2f2f0 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
2f300 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
2f310 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
2f320 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
2f330 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
2f340 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
2f350 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
2f360 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
2f370 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
2f380 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
2f390 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
2f3a0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
2f3b0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
2f3c0 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
2f3d0 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
2f3e0 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
2f3f0 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
2f400 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
2f410 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
2f420 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2f430 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
2f440 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2f450 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
2f460 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
2f470 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2f480 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
2f490 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
2f4a0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
2f4b0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2f4c0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
2f4d0 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
2f4e0 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
2f4f0 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
2f500 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
2f510 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2f520 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
2f530 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
2f540 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
2f550 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
2f560 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
2f570 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
2f580 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
2f590 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
2f5a0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
2f5b0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
2f5c0 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
2f5d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
2f5e0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
2f5f0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2f600 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2f610 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2f620 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
2f630 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
2f640 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
2f650 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2f660 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2f670 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2f680 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2f690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2f6a0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
2f6b0 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
2f6c0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2f6d0 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
2f6e0 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
2f6f0 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
2f700 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
2f710 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
2f720 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
2f730 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
2f740 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
2f750 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
2f760 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
2f770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
2f780 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
2f790 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
2f7a0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
2f7b0 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
2f7c0 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
2f7d0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
2f7e0 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
2f7f0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
2f800 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
2f810 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2f820 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
2f830 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2f840 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
2f850 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
2f860 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
2f870 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2f880 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
2f890 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
2f8a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
2f8b0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
2f8c0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
2f8d0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2f8e0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2f8f0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
2f900 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
2f910 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
2f920 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
2f930 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
2f940 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
2f950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2f960 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2f970 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
2f980 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
2f990 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2f9a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2f9b0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2f9c0 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
2f9d0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2f9e0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
2f9f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2fa00 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2fa10 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2fa20 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
2fa30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
2fa40 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2fa50 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2fa60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2fa70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2fa80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2fa90 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2faa0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
2fab0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2fac0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2fad0 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2fae0 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
2faf0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2fb00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
2fb10 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2fb20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
2fb30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
2fb40 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
2fb50 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
2fb60 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
2fb70 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
2fb80 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
2fb90 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
2fba0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
2fbb0 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
2fbc0 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
2fbd0 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
2fbe0 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
2fbf0 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
2fc00 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
2fc10 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
2fc20 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
2fc30 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
2fc40 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
2fc50 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
2fc60 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
2fc70 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
2fc80 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
2fc90 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
2fca0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
2fcb0 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
2fcc0 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
2fcd0 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
2fce0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
2fcf0 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
2fd00 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20  MemPage.aOvfl[] 
2fd10 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65  array), they are
2fd20 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70   not copied to p
2fd30 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  To. .**.** Befor
2fd40 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67  e returning, pag
2fd50 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69  e pTo is reiniti
2fd60 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72  alized using btr
2fd70 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
2fd80 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61  .** The performa
2fd90 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  nce of this func
2fda0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74  tion is not crit
2fdb0 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ical. It is only
2fdc0 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65   used by .** the
2fdd0 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2fde0 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65  er() and balance
2fdf0 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64  _deeper() proced
2fe00 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66  ures, neither of
2fe10 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61  .** which are ca
2fe20 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72  lled often under
2fe30 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
2fe40 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ances..*/.static
2fe50 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f   void copyNodeCo
2fe60 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
2fe70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
2fe80 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  To, int *pRC){. 
2fe90 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
2fea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74  ITE_OK ){.    Bt
2feb0 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
2fec0 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
2fed0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2fee0 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
2fef0 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63  Data;.    u8 * c
2ff00 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
2ff10 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63  aData;.    int c
2ff20 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
2ff30 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
2ff40 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2ff50 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e  iToHdr = ((pTo->
2ff60 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a  pgno==1) ? 100 :
2ff70 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b   0);.    int rc;
2ff80 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  .    int iData;.
2ff90 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74    .  .    assert
2ffa0 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
2ffb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ffc0 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f  From->nFree>=iTo
2ffd0 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Hdr );.    asser
2ffe0 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
2fff0 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20  om[iFromHdr+5]) 
30000 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
30010 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20  bleSize );.  .  
30020 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
30030 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
30040 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
30050 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
30060 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67 65  /.    iData = ge
30070 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
30080 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20  romHdr+5]);.    
30090 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
300a0 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
300b0 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
300c0 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d  ze-iData);.    m
300d0 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
300e0 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
300f0 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
30100 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
30110 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20  m->nCell);.  .  
30120 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
30130 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
30140 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
30150 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
30160 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20  tructure.    ** 
30170 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
30180 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
30190 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61  zation of pTo ca
301a0 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20  n actually fail 
301b0 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69  under.    ** fai
301c0 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72 63  rly obscure circ
301d0 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20  umstances, even 
301e0 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20 63  though it is a c
301f0 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  opy of initializ
30200 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ed .    ** page 
30210 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  pFrom..    */.  
30220 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
30230 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  0;.    rc = btre
30240 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a  eInitPage(pTo);.
30250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
30270 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
30280 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
30290 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
302a0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
302b0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
302c0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
302d0 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
302e0 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
302f0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
30300 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
30310 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
30320 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f  nters to..    */
30330 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
30340 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a  ACUUM ){.      *
30350 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74  pRC = setChildPt
30360 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20  rmaps(pTo);.    
30370 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
30380 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
30390 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
303a0 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
303b0 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
303c0 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
303d0 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
303e0 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
303f0 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
30400 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
30410 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
30420 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
30430 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
30440 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
30450 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
30460 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
30470 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
30480 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
30490 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
304a0 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
304b0 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
304c0 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
304d0 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
304e0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
304f0 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
30500 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
30510 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
30520 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
30530 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
30540 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
30550 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
30560 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
30570 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
30580 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
30590 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
305a0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
305b0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
305c0 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
305d0 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
305e0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
305f0 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
30600 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
30610 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
30620 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
30630 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
30640 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
30650 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
30660 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
30670 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
30680 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
30690 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
306a0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
306b0 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
306c0 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
306d0 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
306e0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
306f0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
30700 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c  res that all cel
30710 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ls allocated.** 
30720 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
30730 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74  its siblings fit
30740 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44   into MemPage.aD
30750 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74  ata[] before ret
30760 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  urning..**.** In
30770 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
30780 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67  alancing the pag
30790 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
307a0 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65  gs, cells may be
307b0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
307c0 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
307d0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
307e0 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69  e (pParent). Doi
307f0 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75  ng so.** may cau
30800 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  se the parent pa
30810 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  ge to become ove
30820 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
30830 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68  ll. If this.** h
30840 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68  appens, it is th
30850 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
30860 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
30870 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72  o invoke the cor
30880 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e  rect.** balancin
30890 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78  g routine to fix
308a0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73   this problem (s
308b0 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  ee the balance()
308c0 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a   routine). .**.*
308d0 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
308e0 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
308f0 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
30900 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
30910 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
30920 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20  upted state. So 
30930 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
30940 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
30950 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
30960 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
30970 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
30980 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
30990 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70  unction, aOvflSp
309a0 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  ace, is a pointe
309b0 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72  r to a.** buffer
309c0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
309d0 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66  old one page. If
309e0 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67   while inserting
309f0 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
30a00 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28  parent.** page (
30a10 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61 72  pParent) the par
30a20 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
30a30 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20   overfull, this 
30a40 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65  buffer is.** use
30a50 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70  d to store the p
30a60 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77  arent's overflow
30a70 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20   cells. Because 
30a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
30a90 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d  serts.** a maxim
30aa0 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64  um of four divid
30ab0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
30ac0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61  e parent page, a
30ad0 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  nd the maximum.*
30ae0 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * size of a cell
30af0 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61   stored within a
30b00 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
30b10 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74  is always less t
30b20 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68  han 1/4.** of th
30b30 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
30b40 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75   aOvflSpace[] bu
30b50 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  ffer is guarante
30b60 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
30b70 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c  * enough for all
30b80 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
30b90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53  .**.** If aOvflS
30ba0 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20 61  pace is set to a
30bb0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74   null pointer, t
30bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
30bd0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
30be0 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
30bf0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
30c00 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20  root(.  MemPage 
30c10 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
30c20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
30c30 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e  t page of siblin
30c40 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  gs being balance
30c50 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  d */.  int iPare
30c60 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ntIdx,          
30c70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30c80 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e  of "the page" in
30c90 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38   pParent */.  u8
30ca0 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20   *aOvflSpace,   
30cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30cc0 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73   page-size bytes
30cd0 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61   of space for pa
30ce0 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69  rent ovfl */.  i
30cf0 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20 20  nt isRoot       
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d10 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
30d20 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65  t is a root-page
30d30 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
30d40 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
30d50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
30d60 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
30d70 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
30d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d90 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
30da0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
30db0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
30dc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
30dd0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
30de0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
30df0 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
30e00 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30e30 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
30e40 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
30e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e60 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30e70 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
30e80 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30ea0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
30eb0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ed0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
30ee0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
30ef0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
30f00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30f10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
30f20 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
30f30 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
30f40 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
30f50 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
30f60 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
30f70 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
30f80 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
30f90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30fa0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
30fb0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
30fc0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
30fd0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
30fe0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
30ff0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
31000 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
31010 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
31020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
31030 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
31040 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
31050 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
31060 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
31070 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
31080 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
31090 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
310a0 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
310b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
310c0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
310d0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
310e0 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
310f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
31100 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
31110 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
31120 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
31130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31140 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
31150 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
31160 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
31170 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
31180 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
31190 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
311a0 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
311b0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
311c0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
311d0 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
311e0 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
311f0 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
31200 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
31210 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
31220 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
31230 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
31240 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
31250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31260 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
31270 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
31280 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
31290 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
312a0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
312b0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
312c0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
312d0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
312e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
312f0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
31300 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
31310 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
31320 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
31330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
31340 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
31350 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
31360 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
31370 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
31380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
31390 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
313a0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
313b0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
313c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
313d0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
313e0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
313f0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
31400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31410 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
31420 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
31430 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
31440 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
31450 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
31460 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
31470 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
31480 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
31490 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
314a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
314b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
314c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
314d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
314e0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
314f0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
31500 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
31510 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
31520 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
31530 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
31540 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
31550 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
31560 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
31570 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
31580 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
31590 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
315a0 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
315b0 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
315c0 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
315d0 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
315e0 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
315f0 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
31600 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
31610 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
31620 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
31630 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
31640 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
31650 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
31660 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
31670 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
31680 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
31690 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
316a0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
316b0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
316c0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
316d0 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  dx==iParentIdx )
316e0 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
316f0 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
31700 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
31710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
31720 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
31730 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
31740 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
31750 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
31760 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
31770 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
31780 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
31790 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
317a0 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
317b0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
317c0 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
317d0 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
317e0 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
317f0 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
31800 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
31810 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
31820 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
31830 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
31840 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
31850 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
31860 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
31870 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
31880 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
31890 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
318a0 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
318b0 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
318c0 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
318d0 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
318e0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
318f0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
31900 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
31910 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
31920 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
31930 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
31940 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
31950 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
31960 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
31970 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
31980 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
31990 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
319a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
319b0 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
319c0 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e  nxDiv = 0;.    n
319d0 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c  Old = i+1;.  }el
319e0 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33  se{.    nOld = 3
319f0 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e  ;.    if( iParen
31a00 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20  tIdx==0 ){      
31a10 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
31a20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
31a30 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65   }else if( iPare
31a40 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20  ntIdx==i ){.    
31a50 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20    nxDiv = i-2;. 
31a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31a70 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49  nxDiv = iParentI
31a80 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dx-1;.    }.    
31a90 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  i = 2;.  }.  if(
31aa0 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e   (i+nxDiv-pParen
31ab0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70  t->nOverflow)==p
31ac0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
31ad0 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70  .    pRight = &p
31ae0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
31af0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
31b00 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +8];.  }else{.  
31b10 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43    pRight = findC
31b20 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
31b30 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
31b40 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20  verflow);.  }.  
31b50 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31b60 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65  pRight);.  while
31b70 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ( 1 ){.    rc = 
31b80 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
31b90 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64  Bt, pgno, &apOld
31ba0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
31bb0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
31bc0 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
31bd0 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
31be0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
31bf0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
31c00 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
31c10 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
31c20 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
31c30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
31c40 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
31c50 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
31c60 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
31c70 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  t->aOvfl[0].idx 
31c80 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  && pParent->nOve
31c90 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  rflow ){.      a
31ca0 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e  pDiv[i] = pParen
31cb0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  t->aOvfl[0].pCel
31cc0 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  l;.      pgno = 
31cd0 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
31ce0 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
31cf0 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
31d00 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
31d10 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  i]);.      pPare
31d20 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  nt->nOverflow = 
31d30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
31d40 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
31d50 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
31d60 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
31d70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
31d80 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
31d90 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
31da0 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
31db0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
31dc0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
31dd0 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  .      /* Drop t
31de0 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65  he cell from the
31df0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70   parent page. ap
31e00 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69  Div[i] still poi
31e10 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
31e20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
31e30 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e  the parent, even
31e40 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62   though it has b
31e50 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20  een dropped..   
31e60 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61     ** This is sa
31e70 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70  fe because dropp
31e80 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20  ing a cell only 
31e90 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66  overwrites the f
31ea0 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
31eb0 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20  ur bytes of it, 
31ec0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
31ed0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
31ee0 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
31ef0 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
31f00 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
31f10 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65  l. So the pointe
31f20 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  r is safe to use
31f30 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20  .      ** later 
31f40 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20  on.  .      **. 
31f50 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20       ** But not 
31f60 69 66 20 77 65 20 61 72 65 20 69 6e 20 73 65 63  if we are in sec
31f70 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e  ure-delete mode.
31f80 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   In secure-delet
31f90 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a  e mode,.      **
31fa0 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20   the dropCell() 
31fb0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65  routine will ove
31fc0 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72  rwrite the entir
31fd0 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f  e cell with zero
31fe0 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  es..      ** In 
31ff0 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f  this case, tempo
32000 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20  rarily copy the 
32010 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f  cell into the aO
32020 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20  vflSpace[].     
32030 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77   ** buffer. It w
32040 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75  ill be copied ou
32050 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20  t again as soon 
32060 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20  as the aSpace[] 
32070 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20  buffer.      ** 
32080 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  is allocated.  *
32090 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
320a0 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
320b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
320c0 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66  f;..        iOff
320d0 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
320e0 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d  _INT(apDiv[i]) -
320f0 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
32100 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  NT(pParent->aDat
32110 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  a);.        if( 
32120 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e  (iOff+szNew[i])>
32130 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
32140 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
32150 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32160 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32170 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
32180 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
32190 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
321a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
321b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
321c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
321d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
321e0 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66  &aOvflSpace[iOff
321f0 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
32200 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ew[i]);.        
32210 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
32220 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
32230 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
32240 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
32250 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43     }.      dropC
32260 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
32270 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
32280 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69  verflow, szNew[i
32290 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  ], &rc);.    }. 
322a0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
322b0 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
322c0 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
322d0 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
322e0 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
322f0 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
32300 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
32310 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
32320 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
32330 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
32340 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
32350 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
32360 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
32370 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
32380 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
32390 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
323a0 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
323c0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
323d0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
323e0 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
323f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32400 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
32410 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32440 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
32450 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
32460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32480 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
32490 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
324a0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
324b0 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
324c0 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
324d0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
324e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
324f0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
32500 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
32510 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
32520 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
32530 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
32540 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
32550 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
32560 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
32570 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
32580 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
32590 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
325a0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
325b0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
325c0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
325d0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
325e0 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
325f0 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
32600 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
32610 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
32620 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
32630 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
32640 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
32650 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
32660 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
32670 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
32680 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
32690 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
326a0 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
326b0 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
326c0 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
326d0 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
326e0 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
326f0 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
32700 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
32710 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
32720 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
32730 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
32740 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
32750 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
32760 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
32770 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
32780 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
32790 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
327a0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
327b0 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
327c0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
327d0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
327e0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
327f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
32800 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
32810 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
32820 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
32830 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
32840 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
32850 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
32860 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
32870 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
32880 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
32890 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
328a0 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
328b0 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
328c0 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
328d0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
328e0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
328f0 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
32900 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
32910 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
32920 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
32930 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
32940 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
32950 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
32960 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
32970 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
32980 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
32990 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
329a0 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
329b0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
329c0 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
329d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
329e0 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
329f0 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
32a00 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
32a10 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
32a20 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
32a30 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
32a40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
32a50 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
32a60 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
32a70 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
32a80 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
32a90 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
32aa0 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
32ab0 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
32ac0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
32ad0 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
32ae0 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
32af0 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  low;.    if( pOl
32b00 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  d->nOverflow>0 )
32b10 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
32b20 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
32b30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32b40 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
32b50 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
32b60 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f  l[nCell] = findO
32b70 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64  verflowCell(pOld
32b80 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  , j);.        sz
32b90 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65  Cell[nCell] = ce
32ba0 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20  llSizePtr(pOld, 
32bb0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a  apCell[nCell]);.
32bc0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
32bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
32be0 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44  se{.      u8 *aD
32bf0 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74  ata = pOld->aDat
32c00 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73  a;.      u16 mas
32c10 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61  kPage = pOld->ma
32c20 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31  skPage;.      u1
32c30 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70  6 cellOffset = p
32c40 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  Old->cellOffset;
32c50 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
32c60 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
32c70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
32c80 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
32c90 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
32ca0 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65  [nCell] = findCe
32cb0 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b  llv2(aData, mask
32cc0 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74  Page, cellOffset
32cd0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  , j);.        sz
32ce0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65  Cell[nCell] = ce
32cf0 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20  llSizePtr(pOld, 
32d00 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a  apCell[nCell]);.
32d10 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
32d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20  .      }.    }  
32d30 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c       .    if( i<
32d40 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44  nOld-1 && !leafD
32d50 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20  ata){.      u16 
32d60 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b  sz = (u16)szNew[
32d70 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  i];.      u8 *pT
32d80 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  emp;.      asser
32d90 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
32da0 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  ls );.      szCe
32db0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
32dc0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
32dd0 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
32de0 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b  .      iSpace1 +
32df0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
32e00 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78  rt( sz<=pBt->max
32e10 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20  Local+23 );.    
32e20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
32e30 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70  1 <= (int)pBt->p
32e40 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
32e50 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
32e60 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
32e70 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
32e80 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f  ] = pTemp+leafCo
32e90 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
32ea0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
32eb0 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61  ection==0 || lea
32ec0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
32ed0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
32ee0 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e  Cell] = szCell[n
32ef0 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72  Cell] - leafCorr
32f00 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  ection;.      if
32f10 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b  ( !pOld->leaf ){
32f20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32f30 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
32f40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
32f50 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f  sert( pOld->hdrO
32f60 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
32f70 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
32f80 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
32f90 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
32fa0 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
32fb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e  .        ** poin
32fc0 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64  ter of the divid
32fd0 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20  er cell */.     
32fe0 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c     memcpy(apCell
32ff0 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e  [nCell], &pOld->
33000 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20  aData[8], 4);.  
33010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33020 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
33030 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
33040 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
33050 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20  ll[nCell]<4 ){. 
33060 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
33070 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
33080 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
33090 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
330a0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
330b0 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
330c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
330d0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
330e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
330f0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
33100 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
33110 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
33120 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
33130 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
33140 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
33150 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
33160 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
33170 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
33180 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
33190 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
331a0 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
331b0 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
331c0 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
331d0 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
331e0 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
331f0 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
33200 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
33210 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
33220 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
33230 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
33240 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
33250 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
33260 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
33270 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
33280 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
33290 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
332a0 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
332b0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
332c0 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
332d0 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
332e0 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
332f0 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
33300 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
33310 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
33320 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
33330 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
33340 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
33350 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
33360 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
33370 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
33380 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
33390 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
333a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
333b0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
333c0 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
333d0 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
333e0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
333f0 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
33400 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
33410 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
33420 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
33430 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
33440 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
33450 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
33460 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
33470 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
33480 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
33490 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
334a0 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
334b0 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20        k++;.     
334c0 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72   if( k>NB+1 ){ r
334d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
334e0 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61  PT_BKPT; goto ba
334f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d  lance_cleanup; }
33500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
33510 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
33520 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
33530 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
33540 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
33550 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
33560 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
33570 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
33580 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
33590 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
335a0 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
335b0 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
335c0 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
335d0 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
335e0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
335f0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
33600 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
33610 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
33620 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
33630 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
33640 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
33650 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
33660 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
33670 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
33680 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
33690 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
336a0 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
336b0 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
336c0 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
336d0 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
336e0 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
336f0 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
33700 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
33710 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
33720 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
33730 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
33740 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
33750 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
33760 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
33770 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
33780 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
33790 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
337a0 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
337b0 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
337c0 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
337d0 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
337e0 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
337f0 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
33800 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
33810 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
33820 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
33830 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
33840 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
33850 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
33860 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
33870 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
33880 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
33890 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
338a0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
338b0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
338c0 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
338d0 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
338e0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
338f0 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
33900 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
33910 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
33920 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
33930 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
33940 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
33950 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
33960 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
33970 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
33980 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
33990 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
339a0 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
339b0 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
339c0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
339d0 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
339e0 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
339f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
33a00 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
33a10 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
33a20 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
33a30 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20  pPage is.  ** a 
33a40 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
33a50 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f  e.  A virtual ro
33a60 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20  ot page is when 
33a70 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20  the real root.  
33a80 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ** page is page 
33a90 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65  1 and we are the
33aa0 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74   only child of t
33ab0 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  hat page..  */. 
33ac0 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
33ad0 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
33ae0 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
33af0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
33b00 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  );..  TRACE(("BA
33b10 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
33b20 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
33b30 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
33b40 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
33b50 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
33b60 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
33b70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
33b80 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
33b90 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
33ba0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
33bb0 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
33bc0 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
33bd0 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
33be0 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
33bf0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33c00 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
33c10 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
33c20 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
33c30 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
33c40 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
33c50 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
33c60 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
33c70 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
33c80 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
33c90 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
33ca0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
33cb0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
33cc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33cd0 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
33ce0 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
33cf0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
33d00 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
33d10 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
33d20 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
33d30 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
33d40 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
33d50 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
33d60 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29   &pgno, pgno, 0)
33d70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
33d80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
33d90 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
33da0 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
33db0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20      nNew++;..   
33dc0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f     /* Set the po
33dd0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
33de0 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c  for the new sibl
33df0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
33e00 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
33e10 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UUM ){.        p
33e20 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e  trmapPut(pBt, pN
33e30 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ew->pgno, PTRMAP
33e40 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
33e50 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
33e60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33e80 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
33e90 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
33ea0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33eb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
33ec0 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
33ed0 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
33ee0 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
33ef0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
33f00 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72  i<nOld ){.    fr
33f10 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c  eePage(apOld[i],
33f20 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
33f30 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
33f40 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
33f50 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
33f60 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
33f70 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
33f80 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
33f90 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
33fa0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
33fb0 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
33fc0 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
33fd0 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
33fe0 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
33ff0 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
34000 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
34010 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
34020 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
34030 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
34040 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
34050 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
34060 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
34070 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
34080 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
34090 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
340a0 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
340b0 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
340c0 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
340d0 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
340e0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
340f0 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
34100 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
34110 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
34120 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
34130 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
34140 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
34150 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
34160 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
34170 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
34180 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
34190 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
341a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
341b0 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
341c0 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e    int minV = apN
341d0 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
341e0 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
341f0 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
34200 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
34210 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e  f( apNew[j]->pgn
34220 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  o<(unsigned)minV
34230 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
34240 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
34250 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70  nV = apNew[j]->p
34260 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
34270 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
34280 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  i ){.      MemPa
34290 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54  ge *pT;.      pT
342a0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
342b0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
342c0 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
342d0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
342e0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
342f0 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25  RACE(("new: %d(%
34300 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
34310 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
34320 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d  ",.    apNew[0]-
34330 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c  >pgno, szNew[0],
34340 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61  .    nNew>=2 ? a
34350 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[1]->pgno : 
34360 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
34370 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
34380 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32  New>=3 ? apNew[2
34390 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
343a0 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
343b0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
343c0 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e   ? apNew[3]->pgn
343d0 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  o : 0, nNew>=4 ?
343e0 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
343f0 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e     nNew>=5 ? apN
34400 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[4]->pgno : 0,
34410 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
34420 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73  [4] : 0));..  as
34430 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
34440 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34450 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
34460 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52  );.  put4byte(pR
34470 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  ight, apNew[nNew
34480 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  -1]->pgno);..  /
34490 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
344a0 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
344b0 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
344c0 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
344d0 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
344e0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
344f0 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
34500 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
34510 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
34520 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
34530 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
34540 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
34550 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
34560 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
34570 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
34580 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
34590 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
345a0 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
345b0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
345c0 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
345d0 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
345e0 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
345f0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
34600 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
34610 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
34620 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
34630 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
34640 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a  low==0 );..    j
34650 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
34660 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
34670 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
34680 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
34690 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
346a0 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
346b0 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
346c0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
346d0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
346e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
346f0 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e  i<nNew-1 || j==n
34700 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
34710 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
34720 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
34730 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
34740 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
34750 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
34760 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
34770 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
34780 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
34790 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
347a0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70  rection;.      p
347b0 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61  Temp = &aOvflSpa
347c0 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a  ce[iOvflSpace];.
347d0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
347e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
347f0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
34800 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
34810 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  4);.      }else 
34820 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
34830 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
34840 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66  e tree is a leaf
34850 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20  -data tree, and 
34860 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
34870 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20   leaves, .      
34880 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
34890 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65  is no divider ce
348a0 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20  ll in apCell[]. 
348b0 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76  Instead, the div
348c0 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ider .        **
348d0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
348e0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
348f0 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  y for the right-
34900 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20  most cell of .  
34910 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62        ** the sib
34920 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62  ling-page assemb
34930 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a  led above only..
34940 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34950 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
34960 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
34970 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
34980 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
34990 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
349a0 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
349b0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
349c0 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72   sz = 4 + putVar
349d0 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69  int(&pCell[4], i
349e0 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20  nfo.nKey);.     
349f0 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
34a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34a10 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20     pCell -= 4;. 
34a20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
34a30 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
34a40 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
34a50 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
34a60 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
34a70 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
34a80 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
34a90 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65  node, and its re
34aa0 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
34ab0 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
34ac0 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
34ad0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
34ae0 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
34af0 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62         ** (see b
34b00 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
34b10 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
34b20 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
34b30 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
34b40 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
34b50 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
34b60 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
34b70 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
34b80 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
34b90 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
34ba0 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
34bb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34bc0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
34bd0 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
34be0 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
34bf0 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
34c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
34c10 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
34c20 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
34c30 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
34c40 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
34c50 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
34c60 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
34c70 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
34c80 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
34c90 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
34ca0 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
34cb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
34cc0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
34cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
34ce0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
34cf0 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
34d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34d10 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65        iOvflSpace
34d20 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
34d30 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d  sert( sz<=pBt->m
34d40 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20  axLocal+23 );.  
34d50 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66      assert( iOvf
34d60 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70  lSpace <= (int)p
34d70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
34d80 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c        insertCell
34d90 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
34da0 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
34db0 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26  p, pNew->pgno, &
34dc0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
34dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34de0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
34df0 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nup;.      asser
34e00 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
34e10 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
34e20 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
34e30 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
34e40 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
34e50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
34e60 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
34e70 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
34e80 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
34e90 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
34ea0 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
34eb0 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43  =0 ){.    u8 *zC
34ec0 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e  hild = &apCopy[n
34ed0 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
34ee0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  ;.    memcpy(&ap
34ef0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
34f00 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34  ta[8], zChild, 4
34f10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  );.  }..  if( is
34f20 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d  Root && pParent-
34f30 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61  >nCell==0 && pPa
34f40 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c  rent->hdrOffset<
34f50 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65  =apNew[0]->nFree
34f60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
34f70 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
34f80 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61  b-tree now conta
34f90 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68  ins no cells. Th
34fa0 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20  e only sibling. 
34fb0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68     ** page is th
34fc0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
34fd0 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70   the parent. Cop
34fe0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
34ff0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69  f the.    ** chi
35000 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ld page into the
35010 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73   parent, decreas
35020 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
35030 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20  height of the.  
35040 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75    ** b-tree stru
35050 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68  cture by one. Th
35060 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20  is is described 
35070 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d  as the "balance-
35080 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a  shallower".    *
35090 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20  * sub-algorithm 
350a0 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74  in some document
350b0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20  ation..    **.  
350c0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
350d0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
350e0 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c  atabase, the cal
350f0 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  l to copyNodeCon
35100 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73  tent() .    ** s
35110 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ets all pointer-
35120 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
35130 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74  esponding to dat
35140 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65  abase image page
35150 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68  s .    ** for wh
35160 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ich the pointer 
35170 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  is stored within
35180 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   the content bei
35190 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a  ng copied..    *
351a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
351b0 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77  ond assert below
351c0 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
351d0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  he child page is
351e0 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20   defragmented.  
351f0 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65    ** (it must be
35200 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74  , as it was just
35210 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75   reconstructed u
35220 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67  sing assemblePag
35230 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a  e()). This.    *
35240 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  * is important i
35250 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
35260 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
35270 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
35280 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d  tabase.    ** im
35290 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  age.  */.    ass
352a0 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a  ert( nNew==1 );.
352b0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65      assert( apNe
352c0 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a  w[0]->nFree == .
352d0 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74          (get2byt
352e0 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61  e(&apNew[0]->aDa
352f0 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d  ta[5])-apNew[0]-
35300 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65  >cellOffset-apNe
35310 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a  w[0]->nCell*2) .
35320 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e      );.    copyN
35330 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77  odeContent(apNew
35340 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72  [0], pParent, &r
35350 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65  c);.    freePage
35360 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b  (apNew[0], &rc);
35370 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41  .  }else if( ISA
35380 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
35390 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e   /* Fix the poin
353a0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
353b0 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  for all the cell
353c0 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66  s that were shif
353d0 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20  ted around. .   
353e0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65   ** There are se
353f0 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
35400 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72  types of pointer
35410 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61  -map entries tha
35420 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  t need to.    **
35430 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
35440 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
35450 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61  Some of these ha
35460 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65  ve been set alre
35470 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20  ady, but.    ** 
35480 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
35490 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
354a0 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a  a summary:.    *
354b0 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68  *.    **   1) Th
354c0 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
354d0 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69  ated with new si
354e0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74  bling pages that
354f0 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a   were not.    **
35500 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77        siblings w
35510 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
35520 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68  n was called. Th
35530 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ese have already
35540 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65  .    **      bee
35550 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20  n set. We don't 
35560 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62  need to worry ab
35570 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73  out old siblings
35580 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a   that were.    *
35590 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20  *      moved to 
355a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20  the free-list - 
355b0 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63  the freePage() c
355c0 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61  ode has taken ca
355d0 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  re.    **      o
355e0 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a  f those..    **.
355f0 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20      **   2) The 
35600 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35610 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
35620 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
35630 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20  erflow.    **   
35640 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f     page in any o
35650 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75  verflow chains u
35660 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64  sed by new divid
35670 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20  er cells. These 
35680 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76  .    **      hav
35690 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62  e also already b
356a0 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f  een taken care o
356b0 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  f by the insertC
356c0 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20  ell() code..    
356d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49  **.    **   3) I
356e0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
356f0 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
35700 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
35710 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20  ld pages of.    
35720 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74  **      cells st
35730 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c  ored on the sibl
35740 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65  ing pages may ne
35750 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
35760 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
35770 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c    4) If the sibl
35780 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
35790 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65  t internal intke
357a0 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e  y nodes, then an
357b0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76  y.    **      ov
357c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
357d0 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
357e0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
357f0 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20  updated.    **  
35800 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e      (internal in
35810 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72  tkey nodes never
35820 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
35830 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  s to overflow pa
35840 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ges)..    **.   
35850 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20   **   5) If the 
35860 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
35870 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
35880 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
35890 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65  ap.    **      e
358a0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72  ntries for the r
358b0 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73  ight-child pages
358c0 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67   of each sibling
358d0 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
358e0 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61        to be upda
358f0 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
35900 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32  ** Cases 1 and 2
35910 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20   are dealt with 
35920 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63  above by other c
35930 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20  ode. The next.  
35940 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73    ** block deals
35950 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e   with cases 3 an
35960 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20  d 4 and the one 
35970 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65  after that, case
35980 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a   5. Since.    **
35990 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74   setting a point
359a0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20  er map entry is 
359b0 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70  a relatively exp
359c0 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
359d0 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f  , this.    ** co
359e0 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69  de only sets poi
359f0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
35a00 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76   for child or ov
35a10 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
35a20 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63  t have.    ** ac
35a30 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74  tually moved bet
35a40 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
35a50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
35a60 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20  w = apNew[0];.  
35a70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
35a80 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20  = apCopy[0];.   
35a90 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d   int nOverflow =
35aa0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
35ab0 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f  ;.    int iNextO
35ac0 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ld = pOld->nCell
35ad0 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20   + nOverflow;.  
35ae0 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20    int iOverflow 
35af0 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70  = (nOverflow ? p
35b00 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
35b10 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d  x : -1);.    j =
35b20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
35b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b40 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27  /* Current 'old'
35b50 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
35b60 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20  .    k = 0;     
35b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b80 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
35b90 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67  nt 'new' sibling
35ba0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72   page */.    for
35bb0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
35bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
35bd0 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20  sDivider = 0;.  
35be0 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e      while( i==iN
35bf0 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  extOld ){.      
35c00 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
35c10 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
35c20 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
35c30 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f  e last cell on o
35c40 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ld.        ** si
35c50 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66  bling page j. If
35c60 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
35c70 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
35c80 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
35c90 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
35ca0 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73   then cell i was
35cb0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
35cc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
35cd0 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61 79 53  rt( j+1 < ArrayS
35ce0 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b 0a 20  ize(apCopy) );. 
35cf0 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70         pOld = ap
35d00 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20  Copy[++j];.     
35d10 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20     iNextOld = i 
35d20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
35d30 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64  ld->nCell + pOld
35d40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
35d50 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e       if( pOld->n
35d60 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
35d70 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20        nOverflow 
35d80 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
35d90 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76  w;.          iOv
35da0 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65  erflow = i + !le
35db0 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61  afData + pOld->a
35dc0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20  Ovfl[0].idx;.   
35dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
35de0 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66  sDivider = !leaf
35df0 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a  Data;  .      }.
35e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
35e10 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76  verflow>0 || iOv
35e20 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20  erflow<i );.    
35e30 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
35e40 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f  ow<2 || pOld->aO
35e50 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64  vfl[0].idx==pOld
35e60 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31  ->aOvfl[1].idx-1
35e70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
35e80 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70  nOverflow<3 || p
35e90 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
35ea0 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32  x==pOld->aOvfl[2
35eb0 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
35ec0 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77  if( i==iOverflow
35ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69   ){.        isDi
35ee0 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  vider = 1;.     
35ef0 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66     if( (--nOverf
35f00 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  low)>0 ){.      
35f10 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b      iOverflow++;
35f20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35f30 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d   }..      if( i=
35f40 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20  =cntNew[k] ){.  
35f50 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20        /* Cell i 
35f60 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65  is the cell imme
35f70 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
35f80 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  g the last cell 
35f90 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  on new.        *
35fa0 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b  * sibling page k
35fb0 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  . If the sibling
35fc0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70  s are not leaf p
35fd0 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20  ages of an.     
35fe0 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74     ** intkey b-t
35ff0 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69  ree, then cell i
36000 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65   is a divider ce
36010 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
36020 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b  pNew = apNew[++k
36030 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
36040 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69  leafData ) conti
36050 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
36060 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c     assert( j<nOl
36070 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
36080 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20  t( k<nNew );..  
36090 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65      /* If the ce
360a0 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  ll was originall
360b0 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28  y divider cell (
360c0 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20  and is not now) 
360d0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f  or.      ** an o
360e0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72  verflow cell, or
360f0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   if the cell was
36100 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69   located on a di
36110 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a  fferent sibling.
36120 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65        ** page be
36130 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69  fore the balanci
36140 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  ng, then the poi
36150 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
36160 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20   associated.    
36170 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68    ** with any ch
36180 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
36190 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
361a0 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20   updated.  */.  
361b0 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65      if( isDivide
361c0 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21  r || pOld->pgno!
361d0 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
361e0 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
361f0 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
36200 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
36210 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
36220 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d  apCell[i]), PTRM
36230 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
36240 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
36250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
36260 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77  ( szCell[i]>pNew
36270 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
36280 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
36290 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61  tOvflPtr(pNew, a
362a0 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a  pCell[i], &rc);.
362b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
362c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
362d0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
362e0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
362f0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
36300 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79  .        u32 key
36310 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e   = get4byte(&apN
36320 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29  ew[i]->aData[8])
36330 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
36340 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54  Put(pBt, key, PT
36350 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65  RMAP_BTREE, apNe
36360 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  w[i]->pgno, &rc)
36370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36380 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68  .#if 0.    /* Th
36390 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  e ptrmapCheckPag
363a0 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73  es() contains as
363b0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
363c0 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68  s that verify th
363d0 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f  at.    ** all po
363e0 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20  inter map pages 
363f0 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c  are set correctl
36400 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66  y. This is helpf
36410 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a  ul while .    **
36420 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73   debugging. This
36430 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61   is usually disa
36440 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63  bled because a c
36450 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
36460 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65  may.    ** cause
36470 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
36480 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20  tement to fail. 
36490 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68   */.    ptrmapCh
364a0 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20  eckPages(apNew, 
364b0 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61  nNew);.    ptrma
364c0 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61  pCheckPages(&pPa
364d0 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66  rent, 1);.#endif
364e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
364f0 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
36500 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
36510 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20  ANCE: finished: 
36520 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
36530 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
36540 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c       nOld, nNew,
36550 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a   nCell));..  /*.
36560 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
36570 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
36580 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
36590 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63  nup:.  sqlite3Sc
365a0 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
365b0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
365c0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
365d0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
365e0 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
365f0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
36600 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
36610 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
36620 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
36630 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
36640 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36650 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ed when the root
36660 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
36670 65 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a  e structure is.*
36680 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20  * overfull (has 
36690 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
366a0 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a  flow pages)..**.
366b0 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70  ** A new child p
366c0 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  age is allocated
366d0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
366e0 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
366f0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69   root.** page, i
36700 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f  ncluding overflo
36710 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70  w cells, are cop
36720 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69  ied into the chi
36730 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20  ld. The root.** 
36740 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65  page is then ove
36750 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65  rwritten to make
36760 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67   it an empty pag
36770 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74  e with the right
36780 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74  -child .** point
36790 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  er pointing to t
367a0 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a  he new page..**.
367b0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
367c0 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72  ing, all pointer
367d0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
367e0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
367f0 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ges .** that the
36800 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20   new child-page 
36810 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  now contains poi
36820 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64  nters to are upd
36830 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74  ated. The.** ent
36840 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ry corresponding
36850 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68   to the new righ
36860 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
36870 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  of the root.** p
36880 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61  age is also upda
36890 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ted..**.** If su
368a0 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69  ccessful, *ppChi
368b0 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e  ld is set to con
368c0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
368d0 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a   to the child .*
368e0 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54  * page and SQLIT
368f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
36900 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
36910 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71  he caller is req
36920 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c  uired.** to call
36930 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f   releasePage() o
36940 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74  n *ppChild exact
36950 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65  ly once. If an e
36960 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
36970 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
36980 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
36990 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
369a0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
369b0 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
369c0 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c  (MemPage *pRoot,
369d0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69   MemPage **ppChi
369e0 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ld){.  int rc;  
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
36a10 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
36a20 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
36a30 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20  mPage *pChild = 
36a40 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
36a50 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  Pointer to a new
36a60 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
36a70 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
36a80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
36a90 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
36aa0 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
36ab0 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
36ac0 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d  ed *pBt = pRoot-
36ad0 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  >pBt;    /* The 
36ae0 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65  BTree */..  asse
36af0 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  rt( pRoot->nOver
36b00 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65  flow>0 );.  asse
36b10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36b20 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
36b30 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  x) );..  /* Make
36b40 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74   pRoot, the root
36b50 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
36b60 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41  ree, writable. A
36b70 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20  llocate a new . 
36b80 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69   ** page that wi
36b90 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
36ba0 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  w right-child of
36bb0 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65   pPage. Copy the
36bc0 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f   contents.  ** o
36bd0 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65  f the node store
36be0 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20  d on pRoot into 
36bf0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
36c00 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
36c10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36c20 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
36c30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
36c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
36c50 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
36c60 50 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64  Page(pBt,&pChild
36c70 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f  ,&pgnoChild,pRoo
36c80 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20  t->pgno,0);.    
36c90 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
36ca0 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26  pRoot, pChild, &
36cb0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41  rc);.    if( ISA
36cc0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
36cd0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
36ce0 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52  , pgnoChild, PTR
36cf0 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74  MAP_BTREE, pRoot
36d00 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
36d10 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
36d20 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64   ){.    *ppChild
36d30 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
36d40 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
36d50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36d60 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
36d70 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36d80 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
36d90 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
36da0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
36db0 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
36dc0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
36dd0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
36de0 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65  Cell==pRoot->nCe
36df0 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  ll );..  TRACE((
36e00 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
36e10 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
36e20 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  ", pRoot->pgno, 
36e30 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
36e40 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f  .  /* Copy the o
36e50 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72  verflow cells fr
36e60 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69  om pRoot to pChi
36e70 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  ld */.  memcpy(p
36e80 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52  Child->aOvfl, pR
36e90 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  oot->aOvfl, pRoo
36ea0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  t->nOverflow*siz
36eb0 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  eof(pRoot->aOvfl
36ec0 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
36ed0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f  >nOverflow = pRo
36ee0 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a  ot->nOverflow;..
36ef0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f    /* Zero the co
36f00 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e  ntents of pRoot.
36f10 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43   Then install pC
36f20 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68  hild as the righ
36f30 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65  t-child. */.  ze
36f40 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43  roPage(pRoot, pC
36f50 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
36f60 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
36f70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  ut4byte(&pRoot->
36f80 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
36f90 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
36fa0 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69  hild);..  *ppChi
36fb0 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72  ld = pChild;.  r
36fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
36fe0 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
36ff0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
37000 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
37010 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
37020 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
37030 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
37040 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
37050 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
37060 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
37070 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
37080 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
37090 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
370a0 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
370b0 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20  tine. Balancing 
370c0 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a  routines are:.**
370d0 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75  .**   balance_qu
370e0 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  ick().**   balan
370f0 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20  ce_deeper().**  
37100 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37110 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ().*/.static int
37120 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f   balance(BtCurso
37130 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
37140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37150 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e    const int nMin
37160 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73   = pCur->pBt->us
37170 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33  ableSize * 2 / 3
37180 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51  ;.  u8 aBalanceQ
37190 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20  uickSpace[13];. 
371a0 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
371b0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
371c0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63   balance_quick_c
371d0 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54  alled = 0 );.  T
371e0 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
371f0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
37200 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20  ed = 0 );..  do 
37210 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
37220 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
37230 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
37240 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
37250 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66  [iPage];..    if
37260 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( iPage==0 ){.  
37270 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
37280 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
37290 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
372a0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
372b0 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ee is overfull. 
372c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c  In this case cal
372d0 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  l the.        **
372e0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
372f0 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72  ) function to cr
37300 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
37310 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
37320 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  ge.        ** an
37330 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72 65  d copy the curre
37340 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
37350 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  he root-page to 
37360 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  it. The.        
37370 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  ** next iteratio
37380 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
37390 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
373a0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  e child page..  
373b0 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
373c0 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
373d0 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
373e0 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
373f0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
37400 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70 43  eeper(pPage, &pC
37410 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a  ur->apPage[1]);.
37420 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
37430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37440 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61         pCur->iPa
37450 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ge = 1;.        
37460 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
37470 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
37480 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d  pCur->aiIdx[1] =
37490 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
374a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
374b0 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[1]->nOverflow
374c0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
374d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
374e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
374f0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
37500 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37510 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
37520 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20  ree<=nMin ){.   
37530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
37540 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  lse{.      MemPa
37550 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65  ge * const pPare
37560 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  nt = pCur->apPag
37570 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20  e[iPage-1];.    
37580 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78    int const iIdx
37590 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
375a0 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20  Page-1];..      
375b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
375c0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
375d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
375e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
375f0 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
37600 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
37610 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
37620 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
37630 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
37640 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
37650 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
37660 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
37670 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
37680 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
37690 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
376a0 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
376b0 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
376c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
376d0 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
376e0 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
376f0 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
37700 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
37710 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
37720 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
37730 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
37740 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
37750 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
37760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
37770 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
37780 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
37790 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
377a0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
377b0 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
377c0 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
377d0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
377e0 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
377f0 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
37800 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
37810 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
37820 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
37830 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
37840 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
37850 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
37860 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
37870 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
37880 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
37890 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
378a0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
378b0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
378c0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
378d0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
378e0 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
378f0 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
37900 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
37910 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
37920 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
37930 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
37940 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
37950 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
37960 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
37970 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
37980 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
37990 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
379a0 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
379b0 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
379c0 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
379d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
379e0 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
379f0 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
37a00 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
37a10 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
37a20 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
37a30 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
37a40 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
37a50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
37a60 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
37a70 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
37a80 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
37a90 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
37aa0 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
37ab0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
37ac0 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
37ad0 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
37ae0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
37af0 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
37b00 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
37b10 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
37b20 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
37b30 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
37b40 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
37b50 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
37b60 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
37b70 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
37b80 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
37b90 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
37ba0 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
37bb0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
37bc0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
37bd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
37be0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
37bf0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
37c00 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
37c10 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
37c20 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
37c30 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
37c40 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
37c50 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
37c60 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
37c70 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
37c80 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
37c90 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
37ca0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
37cb0 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
37cc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
37cd0 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
37ce0 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
37cf0 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
37d00 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
37d10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
37d20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
37d30 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
37d40 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
37d50 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
37d60 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
37d70 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
37d80 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
37d90 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
37da0 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
37db0 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
37dc0 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
37dd0 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
37de0 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
37df0 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
37e00 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
37e10 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
37e20 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
37e30 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
37e40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
37e50 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
37e60 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
37e70 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
37e80 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
37e90 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
37ea0 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
37eb0 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
37ec0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
37ed0 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
37ee0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
37ef0 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
37f00 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
37f10 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
37f20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
37f30 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37f40 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
37f50 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31  pSpace, iPage==1
37f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
37f70 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
37f80 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65        /* If pFre
37f90 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
37fa0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
37fb0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
37fc0 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed .            
37fd0 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73  ** by a previous
37fe0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
37ff0 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20  _nonroot(). Its 
38000 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20  contents are.   
38010 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20           ** now 
38020 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e  stored either on
38030 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70   real database p
38040 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74  ages or within t
38050 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
38060 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75  ** new pSpace bu
38070 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20  ffer, so it may 
38080 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20  be safely freed 
38090 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
380a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
380b0 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
380c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
380d0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63      /* The pSpac
380e0 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  e buffer will be
380f0 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65   freed after the
38100 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20   next call to.  
38110 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
38120 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72  ce_nonroot(), or
38130 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69   just before thi
38140 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
38150 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20  ns, whichever.  
38160 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73          ** comes
38170 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20   first. */.     
38180 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70       pFree = pSp
38190 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ace;.        }. 
381a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
381b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
381c0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
381d0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
381e0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
381f0 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
38200 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
38210 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
38220 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
38230 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
38240 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
38250 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
38260 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
38270 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
38280 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
38290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
382a0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
382b0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
382c0 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
382d0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
382e0 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
382f0 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
38300 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
38310 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
38320 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
38330 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
38340 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
38350 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
38360 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
38370 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
38380 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
38390 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
383a0 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
383b0 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
383c0 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
383d0 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
383e0 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
383f0 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
38400 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
38410 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
38420 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
38430 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
38440 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
38450 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
38460 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73  o, then a succes
38470 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  sful call to.** 
38480 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
38490 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
384a0 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
384b0 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
384c0 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
384d0 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
384e0 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
384f0 75 6c 74 20 72 65 74 75