/ Hex Artifact Content
Login

Artifact ccafb8a86e9837daabe89ec590862907a669ecad:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
65f0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6600: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6610: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6620: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6630: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6640: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6650: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6660: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6670: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6680: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6690: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
66a0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
66b0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
66c0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
66d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
66e0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
66f0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
6700: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6710: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6720: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6730: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6740: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6750: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6770: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6780: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
67a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
67c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
67d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
67e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
67f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
6800: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6810: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6820: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6840: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6850: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6860: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6880: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6890: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
68a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
68b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
68c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
68d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
68e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
68f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6900: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6910: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6920: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6930: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6940: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6960: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6970: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
69a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
69b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
69c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
69d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
69f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6a00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6a10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6a20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6a40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6a50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6a60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6a70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6a80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6a90: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6aa0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
6ab0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
6ac0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
6ad0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
6ae0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
6af0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
6b00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b10: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b20: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6b30: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6b50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b70: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6b80: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6b90: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6ba0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
6bb0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
6bc0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6bd0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6be0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6bf0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6c00: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6c10: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6c20: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6c30: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6c40: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6c50: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6c60: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6c70: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6c80: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6ca0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6cb0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6cc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6cd0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6ce0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6cf0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6d00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6d10: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6d20: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6d30: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6d40: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6d50: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6d60: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6d70: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6d80: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6d90: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6da0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6db0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6dc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6dd0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6de0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6df0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6e00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6e10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6e30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6e40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6e50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6e60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6e70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6e80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6e90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6ea0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6eb0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6ec0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6ed0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6ef0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6f00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6f10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6f20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6f30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6f50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6f60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6f70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6f80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6fa0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6fb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6fc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6fd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6fe0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ff0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7000: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7010: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7020: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
7030: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
7040: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
7050: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
7060: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
7070: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
7080: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7090: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
70a0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
70b0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
70c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
70d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
70e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
70f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7100: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
7150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
7160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
7180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
71a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
71b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
71c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
71e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
71f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
7240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
7280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
72b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
72c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
72d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
72e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
72f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
73a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
73b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
73c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
73d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
73e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
73f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7470: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7480: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7490: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
74a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
74b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
74c0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
74d0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
74e0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
74f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7500: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7510: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7520: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7530: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7540: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7550: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7560: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
7570: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
7580: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
7590: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
75a0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
75b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
75c0: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
75d0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
75e0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
75f0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7600: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
7610: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
7620: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
7630: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
7640: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
7650: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
7660: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
7670: 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  )nSize;.  }else{
7680: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7690: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
76a0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
76b0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
76c0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
76d0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
76e0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
76f0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7700: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7710: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7720: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
7730: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
7740: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
7750: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
7760: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7770: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7780: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7790: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
77a0: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
77b0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
77c0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
77d0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
77e0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
77f0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7800: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7810: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7820: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
7830: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
7840: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
7850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
7860: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
7870: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
7880: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7890: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78a0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
78b0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
78c0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
78d0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78e0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
78f0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7900: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7910: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7920: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
7930: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7940: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
7950: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
7960: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
7970: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
7980: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7990: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
79a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
79b0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
79c0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
79d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
79e0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
79f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
7a00: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7a10: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
7a30: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
7a40: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
7a50: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
7a60: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
7a70: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7a80: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7a90: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7aa0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
7ab0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
7ac0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
7ad0: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
7ae0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
7af0: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
7b00: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7b10: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7b20: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7b30: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7b40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7b50: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7b60: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7b70: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7b80: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7b90: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7bb0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
7bc0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
7bd0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7bf0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7c00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7c10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7c20: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7c30: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7c40: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c50: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7c60: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7c70: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7c80: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7c90: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7ca0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
7cb0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7cc0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
7cd0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
7ce0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
7cf0: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
7d00: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7d20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7d30: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7d40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7d50: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7d60: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7d70: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7d80: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7d90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7da0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7db0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7dc0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7dd0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7de0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7df0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7e00: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7e10: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7e20: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7e30: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7e40: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7e50: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7e60: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7e70: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7e80: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7e90: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7ea0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7eb0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7ec0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7ed0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7ee0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7ef0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7f00: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7f10: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7f20: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7f30: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7f40: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7f50: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7f60: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7f80: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7f90: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7fa0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7fb0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7fc0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7fd0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7fe0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7ff0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
8000: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
8010: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
8020: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
8030: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
8040: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
8050: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
8060: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
8070: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
8080: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
80a0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
80b0: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
80c0: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
80d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
80e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
80f0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8100: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8110: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8120: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8130: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
8140: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8150: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
8160: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
8170: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
8180: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8190: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
81a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
81b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81c0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
81d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
81e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
81f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8200: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8210: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8220: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
8230: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
8240: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
8250: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
8260: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
8270: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
8280: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8290: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
82a0: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
82b0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
82c0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
82d0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
82e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
82f0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8300: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8310: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8320: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
8330: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
8340: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
8350: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
8360: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
8370: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
8380: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8390: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
83a0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
83b0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
83c0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
83d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
83e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
83f0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8400: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8410: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8420: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8430: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8440: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8450: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8460: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
8470: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
8480: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8490: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
84a0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
84b0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
84c0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
84d0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
84e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
84f0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8500: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8510: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8520: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8530: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8540: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8550: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8560: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
8570: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
8580: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8590: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
85a0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
85b0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
85c0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
85d0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
85e0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
85f0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8600: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8620: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8630: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8640: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8650: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8660: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
8670: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
8680: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8690: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
86a0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
86b0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
86c0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
86d0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
86e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
86f0: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8700: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8710: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8720: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8750: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
8780: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8790: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
87b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
87c0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
87d0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8800: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8820: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8830: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8840: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8850: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8860: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8870: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
8880: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
88b0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
88c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
88d0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
88e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
88f0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8900: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8910: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8930: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8940: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8950: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8960: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
8970: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
8980: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
8990: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
89a0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
89b0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
89c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
89d0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
89e0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
89f0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8a00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8a10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8a20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8a30: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8a40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8a50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8a60: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
8a70: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
8a80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8a90: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
8aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8ac0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8ad0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8ae0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8af0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8b00: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8b10: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8b20: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8b30: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8b40: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8b50: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8b60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
8b80: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
8b90: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
8ba0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
8bb0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8bc0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8bd0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8be0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8bf0: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8c00: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8c10: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8c20: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8c30: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8c40: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8c50: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8c60: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8c70: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
8c80: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8c90: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8ca0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8cb0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8cc0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8cd0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8ce0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8cf0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8d00: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8d20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d30: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8d50: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8d60: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8d70: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
8d80: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
8d90: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
8da0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
8db0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
8dc0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8dd0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8de0: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8df0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8e00: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8e10: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8e30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8e50: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8e60: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8e70: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8e80: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8e90: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ea0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8eb0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8ec0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ed0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ee0: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8f00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8f10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8f20: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8f30: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8f40: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8f50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8f90: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8fa0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8fb0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8fc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8fd0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8fe0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8ff0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
9000: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9010: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
9020: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
9030: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
9040: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
9050: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
9060: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
9070: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
9080: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9090: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
90a0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
90b0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
90c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
90d0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
90e0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
90f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9100: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9110: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9120: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9130: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
9140: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
9150: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
9160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9170: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
9180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
91a0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
91b0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
91c0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
91d0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
91e0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
91f0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9200: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9210: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9220: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
9230: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
9240: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
9250: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
9260: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
9270: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
9280: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9290: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
92a0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
92b0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
92c0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
92d0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
92e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
92f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9300: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9310: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9320: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
9330: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
9340: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
9350: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
9360: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
9370: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
9380: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9390: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
93a0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
93b0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
93c0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
93d0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
93e0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
93f0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9400: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9410: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9430: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9440: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9450: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9460: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
9470: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9480: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9490: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
94a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
94b0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
94c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
94d0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
94e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
94f0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9500: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9530: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9540: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9550: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9580: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9590: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
95a0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
95b0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
95c0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
95d0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
95e0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
95f0: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9600: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9610: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9620: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
9630: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
9640: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
9650: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9660: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9670: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9680: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9690: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
96a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
96b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
96c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
96d0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
96e0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
96f0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9700: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9710: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9720: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9730: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9740: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
9750: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9760: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9770: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
9780: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9790: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
97a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
97b0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
97c0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
97d0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
97e0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
97f0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9800: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9810: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9820: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9830: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
9840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9860: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9870: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9880: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9890: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
98a0: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
98b0: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
98c0: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
98d0: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
98e0: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
98f0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9900: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9910: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9920: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9930: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
9940: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9950: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
9960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
9970: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
9980: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
9990: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
99a0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
99b0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
99c0: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
99d0: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
99e0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
99f0: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9a00: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9a10: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9a20: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9a40: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
9a50: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
9a60: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9a70: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
9a80: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9a90: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9aa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9ab0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9ac0: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9ad0: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9ae0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9b20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b30: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9b40: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9b60: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9b70: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9b80: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9ba0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9bb0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9bc0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
9bd0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
9be0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
9bf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
9c00: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
9c10: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
9c20: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
9c30: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9c40: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
9c50: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
9c60: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
9c70: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
9c80: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
9c90: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
9ca0: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
9cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9cc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9cd0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
9cf0: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
9d00: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
9d10: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
9d20: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
9d30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
9d40: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
9d50: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
9d60: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
9d70: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
9d80: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
9d90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9da0: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
9db0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9dc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9dd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9de0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
9df0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9e00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
9e10: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
9e20: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
9e30: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
9e40: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
9e50: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
9e60: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
9e70: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
9e80: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
9e90: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9ea0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9eb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9ec0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9ed0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9ee0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9ef0: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9f00: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9f10: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9f20: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9f30: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9f40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9f50: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9f60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9f70: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9f80: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9f90: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9fa0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9fb0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9fc0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9fd0: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9fe0: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9ff0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
a000: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
a010: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a020: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
a030: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
a040: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
a050: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
a060: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
a070: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
a080: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a0a0: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
a0b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a0c0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
a0d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
a0e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a0f0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
a100: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
a110: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
a120: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
a130: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
a140: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
a150: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
a160: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
a170: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
a180: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
a190: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
a1a0: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
a1b0: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
a1c0: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
a1d0: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
a1e0: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
a1f0: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a210: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a220: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a230: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a240: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a250: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a260: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a280: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a290: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a2a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a2b0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a2c0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a2d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a2e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a2f0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a300: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a310: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a320: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a330: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a340: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a360: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a370: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a380: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a390: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a3a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a3b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a3c0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a3d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a3e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a400: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a410: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a420: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a430: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a440: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a450: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a460: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a470: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a480: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a490: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a4a0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a4b0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a4c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a4d0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a4e0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a4f0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a500: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a510: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a520: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a530: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a540: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a550: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a560: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a570: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a580: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a590: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a5a0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a5b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a5c0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a5d0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a5e0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a5f0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a600: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a610: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a620: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a630: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a640: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a650: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a660: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a670: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a680: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a690: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a6a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a6b0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a6c0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a6d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a6e0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a6f0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a700: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a710: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a720: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a730: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a740: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a750: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a770: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a780: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a790: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a7a0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a7c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a7d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a7e0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a7f0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a800: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a810: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a820: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a830: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a840: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a850: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a860: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a870: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a880: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a890: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a8a0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a8b0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a8c0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a8d0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a8e0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a8f0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a900: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a910: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a930: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a950: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a960: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a970: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a980: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a990: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9a0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a9b0: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a9c0: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a9d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a9e0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a9f0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
aa00: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
aa10: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
aa20: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
aa30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aa50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
aa60: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
aa70: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
aa80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa90: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
aaa0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
aab0: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
aac0: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
aad0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
aae0: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
aaf0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ab00: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
ab10: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
ab20: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
ab30: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
ab40: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
ab50: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
ab60: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
ab70: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
ab80: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ab90: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
aba0: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
abb0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
abc0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
abd0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
abe0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
abf0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ac00: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ac10: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ac20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
ac30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ac40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
ac50: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
ac60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ac70: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
ac80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ac90: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
aca0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
acb0: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
acc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
acd0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ace0: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
acf0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ad00: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ad10: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ad20: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ad30: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
ad40: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
ad50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
ad60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ad70: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
ad80: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ad90: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ada0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
adb0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
adc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
add0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ade0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
adf0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ae00: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ae10: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ae20: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ae30: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
ae40: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
ae50: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
ae60: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ae70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ae80: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ae90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
aea0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
aeb0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
aec0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aed0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
aee0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
aef0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
af00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
af10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
af20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
af30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
af40: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
af50: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
af60: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
af70: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
af80: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
af90: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
afa0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
afb0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
afc0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
afd0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
afe0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
aff0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b000: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b010: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b020: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b040: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b050: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b060: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b070: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b080: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b090: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b0a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b0b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b0c0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b0d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b0e0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b0f0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b100: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b110: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b130: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b150: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b160: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b170: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b180: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b190: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b1a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b1b0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b1c0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b1d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b1e0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b1f0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b200: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b210: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b220: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b230: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b240: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b250: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b260: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b270: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b280: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b290: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b2a0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b2c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b2d0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b2e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b2f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b310: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b320: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b330: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b340: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b350: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b360: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b370: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b390: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b3b0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b3c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b3d0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b3e0: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b3f0: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b400: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b420: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b430: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b440: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b450: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b460: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b470: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b480: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b490: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b4a0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b4b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b4c0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b4d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b4e0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b4f0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b500: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b510: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b520: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b530: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b540: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b550: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b560: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b570: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b580: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b590: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b5b0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b5c0: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b5d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b5e0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b5f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b600: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b610: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b620: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b630: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b640: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b650: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b660: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b670: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b680: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b690: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b6a0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b6b0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b6c0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b6d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b6e0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b6f0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b700: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b710: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b720: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b730: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b740: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b750: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b760: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b770: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b780: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b790: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b7a0: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b7b0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b7c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b7d0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b7e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b7f0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b800: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b810: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b820: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b830: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b840: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b850: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b860: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b870: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b880: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b890: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b8a0: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b8b0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b8c0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b8e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b900: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b910: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b920: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b930: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b940: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b950: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b960: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b970: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b980: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b990: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b9a0: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b9b0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b9c0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b9d0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b9e0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b9f0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ba00: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ba10: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
ba20: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
ba30: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
ba40: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
ba50: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
ba60: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
ba70: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
ba80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
ba90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
baa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
bab0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
bac0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
bad0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
bae0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
baf0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
bb00: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
bb10: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
bb20: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
bb30: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bb40: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bb50: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bb60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bb70: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
bb80: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bb90: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bba0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bbb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bbc0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bbd0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bbe0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bbf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc00: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bc10: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bc20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bc30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bc40: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bc50: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bc60: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bc70: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bc80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc90: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bcb0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bce0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bcf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bd10: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bd20: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bd30: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bd40: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bd50: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bd60: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bd70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bd80: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
bd90: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
bda0: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
bdb0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bdc0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bdd0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bde0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bdf0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
be00: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
be10: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
be20: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
be30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
be50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
be60: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
be70: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
be80: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
be90: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bea0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
beb0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bec0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bed0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bee0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bef0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf00: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bf10: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bf20: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bf30: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bf40: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bf50: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bf60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bf70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bf80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bf90: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bfa0: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bfb0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bfc0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bfd0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bfe0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bff0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c000: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c010: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c020: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c030: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c040: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c050: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c060: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c070: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c080: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c090: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c0a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c0b0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c0c0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c0d0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c0e0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c0f0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c100: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c110: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c120: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c130: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c140: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c150: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c160: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c170: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c180: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c1a0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c1b0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c1c0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c1d0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c1e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c1f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c200: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c210: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c220: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c230: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c240: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c250: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c270: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c280: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c290: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c2a0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c2b0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c2c0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c2d0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c2e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c2f0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c310: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c320: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c330: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c350: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c360: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c370: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c380: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c390: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c3a0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c3b0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c3c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c3d0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c3e0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c410: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c420: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c430: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c440: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c450: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c460: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c470: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c480: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c490: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c4a0: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c4b0: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c4c0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c4d0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c4e0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c4f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c500: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c510: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c520: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c530: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c540: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c550: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c560: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c570: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c580: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c590: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c5a0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c5b0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c5c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c5d0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c5e0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c5f0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c600: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c610: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c620: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c630: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c640: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c650: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c660: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c670: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c680: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c690: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c6a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c6b0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c6c0: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c6d0: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c6e0: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c6f0: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c700: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c710: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c720: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c730: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c740: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c750: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c760: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c770: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c780: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c790: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c7a0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c7b0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c7c0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c7d0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c7e0: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c7f0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c800: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c810: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c820: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c830: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c840: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c860: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c870: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c880: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c890: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c8a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c8b0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c8c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c8d0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c8e0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c8f0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c900: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c910: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c920: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c930: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c940: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c950: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c960: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c970: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c980: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c990: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c9a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c9b0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c9c0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c9d0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c9e0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c9f0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
ca00: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
ca10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ca20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ca30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
ca40: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
ca50: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
ca60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
ca70: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
ca80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
ca90: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
caa0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
cab0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
cac0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cad0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
cae0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
caf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cb00: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb20: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
cb30: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cb40: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cb50: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cb60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cb70: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
cb80: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cb90: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cba0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cbb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cbc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cbd0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cbe0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cbf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cc00: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cc10: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cc20: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cc30: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
cc40: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cc50: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc60: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc70: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
cc80: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cc90: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cca0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
ccb0: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
ccc0: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
ccd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cce0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
ccf0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cd00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cd10: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cd20: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cd30: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
cd40: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
cd50: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cd60: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cd70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cd80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
cda0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
cdb0: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
cdc0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
cdd0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
cde0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
cdf0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ce00: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ce10: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ce20: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
ce30: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
ce40: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
ce50: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
ce60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
ce70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
ce80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
ce90: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
cea0: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
ceb0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
cec0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
ced0: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
cee0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
cef0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
cf00: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
cf10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
cf20: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cf30: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
cf40: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cf50: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cf60: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cf70: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cf80: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
cf90: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
cfa0: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
cfb0: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
cfc0: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
cfd0: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
cfe0: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
cff0: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
d000: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
d010: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
d020: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d030: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
d040: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d050: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d060: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
d070: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
d080: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d090: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d0a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d0b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d0c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d0d0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d0e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d0f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d100: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d110: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d120: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d130: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d150: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d160: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d170: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d190: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d1a0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d1b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d1d0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d1e0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d1f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d200: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d210: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d220: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d230: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d240: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d250: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d260: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d270: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d280: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d290: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d2a0: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d2b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d2c0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d2d0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d2e0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d2f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d300: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d310: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d320: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d330: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d340: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d350: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d360: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d370: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d380: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d390: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d3a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d3b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d3c0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d3d0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d3e0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d3f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d400: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d410: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d420: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d430: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d440: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d450: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d460: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d470: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d480: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d490: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d4a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d4b0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d4c0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d4d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d4e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d4f0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d500: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d510: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d520: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d530: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d540: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d560: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d570: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d580: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d590: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d5a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d5b0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d5c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d5d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d5e0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d5f0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d600: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d620: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d630: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d640: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d660: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d670: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d680: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d690: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d6a0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d6b0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d6c0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d6d0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d6e0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d6f0: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d700: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d710: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d720: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d730: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d740: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d750: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d760: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d770: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d780: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d790: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d7a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d7b0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d7c0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d7d0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d7e0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d7f0: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d800: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d810: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d820: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d830: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d840: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d850: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d860: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d870: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d880: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d890: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d8a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d8b0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d8d0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d8f0: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d900: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d910: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d920: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d930: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d950: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d960: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d970: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d990: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d9a0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
d9b0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
d9c0: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
d9d0: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
d9e0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
d9f0: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
da00: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
da10: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
da20: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
da30: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
da40: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
da50: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
da60: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
da70: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
da80: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
da90: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
daa0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
dab0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
dac0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
dad0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
dae0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
daf0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
db00: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
db10: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
db20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
db30: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
db40: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
db50: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
db60: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
db70: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
db80: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
db90: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
dba0: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
dbb0: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
dbc0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
dbd0: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
dbe0: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
dbf0: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
dc00: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
dc10: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
dc20: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dc30: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dc40: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dc50: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dc60: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dc70: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dc80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dc90: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dca0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dcb0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dcc0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dcd0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dce0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dcf0: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dd00: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dd10: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dd20: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dd30: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
dd40: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
dd50: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
dd60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dd70: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
dd80: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
dd90: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
dda0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
ddb0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
ddc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ddd0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
dde0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
ddf0: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
de00: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
de10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
de20: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
de30: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
de40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
de50: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
de60: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
de70: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
de80: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
de90: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
deb0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
dec0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
ded0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
dee0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
def0: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
df00: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
df10: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
df20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df30: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
df40: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
df50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
df60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
df70: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
df80: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
df90: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dfc0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
dfd0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
dfe0: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
dff0: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
e000: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
e010: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
e020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e040: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
e050: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
e060: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
e090: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
e0a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
e0b0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
e0c0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
e0d0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
e0e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
e0f0: 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
e100: 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
e110: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
e120: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
e130: 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
e140: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
e150: 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
e160: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
e170: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
e180: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
e190: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
e1a0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
e1b0: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
e1c0: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
e1d0: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
e1e0: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
e1f0: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
e200: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
e210: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
e220: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
e230: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
e240: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
e250: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e260: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
e270: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e280: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e290: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
e2a0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
e2b0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
e2c0: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
e2d0: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
e2e0: 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
e2f0: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
e300: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
e310: 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
e340: 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
e350: 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a 20 20  nMemory(db));.  
e360: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
e370: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
e380: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e390: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
e3a0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
e3b0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78  ssert( (flags&0x
e3c0: 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20  ff)==flags );   
e3d0: 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20  /* flags fit in 
e3e0: 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  8 bits */..  /* 
e3f0: 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e  Only a BTREE_SIN
e400: 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e  GLE database can
e410: 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45   be BTREE_UNORDE
e420: 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  RED */.  assert(
e430: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
e440: 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c  UNORDERED)==0 ||
e450: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
e460: 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20  SINGLE)!=0 );.. 
e470: 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47   /* A BTREE_SING
e480: 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61  LE database is a
e490: 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72  lways a temporar
e4a0: 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72  y and/or ephemer
e4b0: 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
e4c0: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
e4d0: 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54  INGLE)==0 || isT
e4e0: 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  empDb );..  if( 
e4f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
e500: 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  TE_NoReadlock ){
e510: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
e520: 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b  REE_NO_READLOCK;
e530: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 65 6d  .  }.  if( isMem
e540: 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
e550: 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
e560: 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
e570: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e580: 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
e590: 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
e5a0: 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
e5b0: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
e5c0: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
e5d0: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
e5e0: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
e5f0: 42 3b 0a 20 20 7d 0a 20 20 70 56 66 73 20 3d 20  B;.  }.  pVfs = 
e600: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20  db->pVfs;.  p = 
e610: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e620: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
e630: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e640: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e650: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
e660: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
e670: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
e680: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
e690: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e6a0: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
e6b0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
e6c0: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
e6d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
e6e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e6f0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e700: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e710: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e720: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
e730: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
e740: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
e750: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
e760: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
e770: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
e780: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
e790: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
e7a0: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
e7b0: 3d 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d  =0 && isTempDb==
e7c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  0 ){.    if( vfs
e7d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e7e0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e7f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e800: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
e810: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e820: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
e830: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e840: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
e850: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e860: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e870: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
e880: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e890: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
e8a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e8b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e8c0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
e8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e8e0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
e900: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
e910: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
e920: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
e930: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e940: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
e950: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
e960: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
e970: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
e980: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e990: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
e9a0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
e9b0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e9c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e9d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
e9e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e9f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
ea00: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ea10: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
ea20: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ea30: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ea40: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
ea50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
ea60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
ea70: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
ea80: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
ea90: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
eaa0: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
eab0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
eae0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
eaf0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
eb00: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
eb10: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
eb20: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
eb30: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
eb40: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
eb50: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
eb60: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
eb70: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
eb80: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
eb90: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ebb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ebc0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ebe0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ebf0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ec00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec10: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ec20: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ec30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ec40: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ec50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ec60: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ec70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ec80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec90: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
eca0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ecb0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
ecc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ecd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ece0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ecf0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ed00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ed10: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ed20: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ed30: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ed40: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ed50: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ed60: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
ed70: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
ed80: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
ed90: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
eda0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
edb0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
edc0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
edd0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
ede0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
edf0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
ee00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ee10: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
ee20: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
ee30: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
ee40: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
ee50: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
ee60: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
ee70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
ee80: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
ee90: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
eea0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
eeb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
eec0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
eed0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
eee0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
eef0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
ef00: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
ef10: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
ef20: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
ef30: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
ef40: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
ef50: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
ef60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ef70: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
ef80: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
ef90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efa0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
efb0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
efc0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efd0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
efe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
eff0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f000: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f010: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f020: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f030: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f040: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f050: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f060: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f070: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f080: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f090: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f0a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f0b0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f0c0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f0d0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f0f0: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f100: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f110: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f120: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f130: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f140: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
f150: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
f160: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
f170: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
f180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f190: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f1a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f1b0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f1c0: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
f1d0: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
f1e0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
f1f0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
f200: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f210: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
f220: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f230: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
f240: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
f250: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
f260: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
f270: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
f280: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
f290: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
f2a0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
f2b0: 67 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ger);.#ifdef SQL
f2c0: 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
f2d0: 45 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72  E.    pBt->secur
f2e0: 65 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e  eDelete = 1;.#en
f2f0: 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  dif.    pBt->pag
f300: 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
f310: 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
f320: 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
f330: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
f340: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
f350: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
f360: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
f370: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
f380: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
f390: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
f3a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
f3b0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
f3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3d0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f3e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
f3f0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
f400: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
f410: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
f420: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
f430: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
f440: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
f450: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
f460: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
f470: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
f480: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f490: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
f4a0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
f4b0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
f4c0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
f4d0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
f4e0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
f4f0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
f500: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
f510: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
f520: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
f530: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
f540: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
f550: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f560: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
f570: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
f580: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
f590: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
f5a0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
f5b0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
f5c0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f5d0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f5e0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
f5f0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f600: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f610: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
f620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
f630: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
f640: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
f650: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
f660: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
f670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f680: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
f690: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
f6a0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
f6b0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
f6c0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
f6d0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
f6e0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
f6f0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
f700: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
f710: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f720: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
f730: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
f740: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
f750: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
f760: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
f770: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
f780: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
f790: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f7a0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
f7b0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
f7c0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
f7d0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
f7e0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
f7f0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
f800: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f810: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f820: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f830: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f840: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
f850: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
f860: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
f870: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
f880: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
f890: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
f8a0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
f8b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
f8c0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
f8d0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
f8e0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
f8f0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f900: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f910: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
f920: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
f930: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
f940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
f950: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
f960: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
f970: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
f980: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f990: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
f9a0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
f9b0: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
f9c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f9d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
f9e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f9f0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
fa00: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
fa10: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
fa20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
fa30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fa40: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
fa50: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
fa60: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
fa70: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fa80: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
fa90: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
faa0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fab0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
fac0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
fad0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
fae0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
faf0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
fb00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fb10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
fb20: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fb30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fb40: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
fb50: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
fb60: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
fb70: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
fb80: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
fb90: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
fba0: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
fbb0: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
fbc0: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
fbd0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
fbe0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
fbf0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
fc00: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
fc10: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
fc20: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
fc30: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
fc40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
fc50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
fc60: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
fc70: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
fc80: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
fc90: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
fca0: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
fcb0: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
fcc0: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
fcd0: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
fce0: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
fcf0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
fd00: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
fd10: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
fd20: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
fd30: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
fd40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fd50: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
fd60: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
fd70: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
fd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
fd90: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
fda0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
fdb0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fdc0: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
fdd0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
fde0: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
fdf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
fe00: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
fe10: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
fe20: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
fe30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
fe40: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
fe50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
fe70: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
fe80: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
fe90: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
fea0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
feb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
fec0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
fed0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
fee0: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
fef0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
ff00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
ff10: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
ff20: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ff30: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
ff40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ff50: 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
ff60: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
ff70: 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
ff80: 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
ff90: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
ffa0: 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
ffb0: 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
ffc0: 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
ffd0: 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
ffe0: 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
fff0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
10000 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
10010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
10020 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
10030 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
10040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
10050 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
10060 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
10070 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
10080 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
10090 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
100a0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
100b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
100c0 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
100d0 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
100e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
100f0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
10100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10110 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
10120 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
10130 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
10140 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
10150 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
10160 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
10170 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
10180 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
10190 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
101a0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
101b0 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
101c0 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
101d0 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
101e0 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
101f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
10200 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
10210 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
10220 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10230 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
10240 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
10250 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
10260 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
10270 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
10280 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
10290 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
102a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
102b0 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
102c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
102d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
102e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
102f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10300 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10310 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10320 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10330 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10340 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10350 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10360 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10370 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10380 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10390 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
103a0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
103b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
103c0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
103d0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
103e0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
103f0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10400 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10410 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10420 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10430 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10440 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10450 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10460 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10470 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10490 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
104a0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
104b0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
104c0 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
104d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
104e0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
104f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10500 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10510 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10520 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10530 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10540 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10550 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10560 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10570 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10580 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10590 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
105a0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
105b0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
105c0 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
105d0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
105e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
105f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10600 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10610 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
10620 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10630 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10640 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10650 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10660 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10670 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10680 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
10690 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
106a0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
106b0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
106c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
106d0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
106e0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
106f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10700 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10710 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10720 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10730 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10740 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10750 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10760 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10780 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
10790 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
107a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
107b0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
107c0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
107d0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
107e0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
107f0 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10800 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10810 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10820 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10830 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10840 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10850 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10860 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10880 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10890 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
108a0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
108b0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
108c0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
108d0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
108e0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
108f0 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10900 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10910 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
10920 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10930 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10940 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10950 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10960 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10970 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10980 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
10990 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
109a0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
109b0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
109c0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
109d0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
109e0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
109f0 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10a00 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10a10 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10a20 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10a30 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10a40 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10a50 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10a60 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10a70 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10a80 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
10a90 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
10aa0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10ab0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10ac0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10ad0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10af0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10b00 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10b10 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10b20 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10b30 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10b40 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10b50 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10b60 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10b70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10b80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10b90 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
10ba0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
10bb0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10bc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10bd0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
10be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10bf0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10c00 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10c10 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10c20 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10c30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10c40 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10c50 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10c60 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10c70 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10c80 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
10c90 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
10ca0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
10cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10cc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10cd0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
10ce0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10cf0 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10d00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10d10 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10d20 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10d30 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10d40 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10d50 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10d60 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10d70 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10d80 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
10d90 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
10da0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
10db0 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
10dc0 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
10dd0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
10de0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
10df0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
10e00 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
10e10 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
10e20 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
10e30 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
10e40 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
10e50 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
10e60 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
10e70 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
10e80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
10e90 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
10ea0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
10eb0 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
10ec0 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
10ed0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
10ee0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
10ef0 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
10f00 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
10f10 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
10f20 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
10f30 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
10f40 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
10f50 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
10f60 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
10f70 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
10f80 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
10f90 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
10fa0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
10fb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10fc0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10fd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10fe0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10ff0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11000 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11010 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
11020 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11030 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11040 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11050 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11070 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11080 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
11090 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
110a0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
110b0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
110c0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
110d0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
110e0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
110f0 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
11100 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
11110 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
11120 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
11130 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
11140 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11150 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11160 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11170 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11180 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
11190 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
111a0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
111b0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
111c0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
111d0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
111e0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
111f0 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
11200 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
11210 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
11220 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
11230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
11240 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11250 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11260 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42  SafetyLevel(.  B
11270 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11290 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
112a0 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
112b0 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
112c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
112d0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
112e0 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
112f0 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69  L, 3=FULL */.  i
11300 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20  nt fullSync,    
11310 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
11320 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20  fullfsync. */.  
11330 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63  int ckptFullSync
11340 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11350 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
11360 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  fync */.){.  BtS
11370 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11380 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
113a0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
113b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  );.  assert( lev
113c0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
113d0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  3 );.  sqlite3Bt
113e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
113f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
11400 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
11410 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
11420 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c  llSync, ckptFull
11430 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
11440 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11460 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11470 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11480 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
11490 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
114a0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
114b0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
114c0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
114d0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
114e0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
114f0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11500 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
11510 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
11520 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11530 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11540 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11560 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
11570 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
11580 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
11590 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
115a0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
115b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
115c0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
115d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
115e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
115f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
11600 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11610 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
11620 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
11630 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
11640 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
11650 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
11660 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
11670 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
11680 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
11690 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
116a0 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
116b0 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
116c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
116d0 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
116e0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
116f0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
11700 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
11710 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
11720 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
11730 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
11740 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
11750 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
11760 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
11770 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
11780 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
11790 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
117a0 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
117b0 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
117c0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
117d0 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
117e0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
117f0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
11800 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
11810 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
11820 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
11830 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
11840 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
11850 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
11860 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
11870 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
11880 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
11890 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
118a0 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
118b0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
118c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
118d0 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
118e0 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
118f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
11900 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
11910 68 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65  hen the pageSize
11920 46 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65  Fixed flag is se
11930 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
11940 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
11950 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
11960 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
11970 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
11980 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
11990 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
119a0 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
119b0 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
119c0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
119d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
119e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
119f0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11a00 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
11a10 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
11a20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
11a30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
11a40 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
11a50 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ixed ){.    sqli
11a60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11a70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11a80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
11a90 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
11aa0 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
11ab0 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
11ac0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
11ad0 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
11ae0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
11af0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
11b00 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
11b10 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
11b20 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
11b30 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
11b40 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
11b50 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
11b60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
11b70 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
11b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11b90 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
11ba0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
11bb0 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
11bc0 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
11bd0 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
11be0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
11bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11c00 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
11c10 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
11c20 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
11c30 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
11c40 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
11c50 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
11c60 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
11c70 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65  iFix ) pBt->page
11c80 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20  SizeFixed = 1;. 
11c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11ca0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11cb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11cc0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
11cd0 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
11ce0 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
11cf0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
11d00 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
11d10 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
11d20 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
11d30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
11d40 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
11d50 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
11d60 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
11d70 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
11d80 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
11d90 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11da0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
11db0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
11dc0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
11dd0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
11de0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11df0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
11e00 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
11e10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11e20 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
11e30 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
11e40 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
11e50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11e60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11e70 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
11e80 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
11e90 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
11ea0 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
11eb0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
11ec0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
11ed0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
11ee0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
11ef0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
11f00 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
11f10 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
11f20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
11f30 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
11f40 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
11f50 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
11f60 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
11f70 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
11f80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11f90 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
11fa0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
11fb0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
11fc0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
11fd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11fe0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
11ff0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
12000 75 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69  ureDelete flag i
12010 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
12020 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
12030 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
12040 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
12050 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12060 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12070 20 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a   secureDelete.**
12080 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
12090 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
120a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
120b0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
120c0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
120d0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
120e0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
120f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12100 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12110 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
12120 20 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72     p->pBt->secur
12130 65 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c  eDelete = (newFl
12140 61 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a  ag!=0) ? 1 : 0;.
12150 20 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42    } .  b = p->pB
12160 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b  t->secureDelete;
12170 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12180 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12190 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n b;.}.#endif /*
121a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
121b0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
121c0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
121d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
121e0 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
121f0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
12200 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12210 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12220 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
12230 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
12240 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
12250 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
12260 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
12270 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
12280 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
12290 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
122a0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
122b0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
122c0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
122d0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
122e0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
122f0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
12300 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
12310 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
12320 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
12330 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12340 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12350 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12360 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
12370 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12380 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
12390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
123a0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
123b0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
123c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
123d0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
123e0 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20  ageSizeFixed && 
123f0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
12400 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
12420 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
12430 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12440 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
12450 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
12460 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
12470 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12480 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12490 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
124a0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
124b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
124c0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
124d0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
124e0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
124f0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
12500 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
12510 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
12520 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
12530 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
12540 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12550 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12560 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
12570 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
12580 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
12590 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
125a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
125b0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
125c0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
125d0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
125e0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
125f0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
12600 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
12610 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
12620 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
12630 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12640 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12650 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12660 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
12670 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
12680 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12690 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
126a0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
126b0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
126c0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
126d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
126e0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
126f0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
12700 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
12710 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
12720 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
12730 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
12740 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
12750 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
12760 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
12770 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
12780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
12790 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
127a0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
127b0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
127c0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
127d0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
127e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
127f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12800 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
12810 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
12820 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
12830 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
12840 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12850 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
12860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12870 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12880 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
12890 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
128a0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
128b0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
128c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
128d0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
128e0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
128f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
12900 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
12910 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
12920 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12930 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12940 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12950 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12960 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
12970 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
12980 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
12990 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
129a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
129b0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
129c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
129d0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
129e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
129f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
12a00 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
12a10 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
12a20 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
12a30 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
12a40 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
12a50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
12a60 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
12a70 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
12a80 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
12a90 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
12aa0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12ab0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12ac0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
12ad0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
12ae0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
12af0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
12b00 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12b10 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
12b20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
12b30 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
12b40 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
12b50 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
12b60 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
12b70 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
12b80 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
12b90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12ba0 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
12bb0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
12bc0 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
12bd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12be0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12bf0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
12c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12c10 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
12c20 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
12c30 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
12c40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
12c50 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
12c60 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12c70 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12c80 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
12c90 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
12ca0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12cb0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12cc0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
12cd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12ce0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12cf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12d00 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
12d10 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
12d20 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
12d30 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
12d40 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
12d50 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
12d60 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
12d70 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
12d80 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12da0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
12db0 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
12dc0 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
12dd0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
12de0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
12df0 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
12e00 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
12e10 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
12e20 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
12e30 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
12e40 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
12e50 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
12e60 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
12e70 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
12e80 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
12e90 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
12ea0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
12eb0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
12ec0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
12ed0 32 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55  2 && pBt->doNotU
12ee0 73 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20  seWAL==0 ){.    
12ef0 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
12f00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12f10 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
12f20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
12f30 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
12f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12f50 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12f60 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12f70 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
12f80 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
12f90 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
12fa0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
12fb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12fc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
12fd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12fe0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
12ff0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13000 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
13010 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
13020 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
13030 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
13040 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13050 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13060 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13070 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13080 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13090 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
130a0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
130b0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
130c0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
130d0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
130e0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
130f0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
13100 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
13110 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
13120 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
13130 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
13140 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13150 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13160 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13170 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13180 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13190 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
131a0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
131b0 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
131c0 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
131d0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
131e0 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
131f0 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
13200 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13210 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13220 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
13230 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13240 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13250 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13260 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13270 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13280 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13290 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
132a0 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
132b0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
132c0 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
132d0 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
132e0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
132f0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
13300 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
13310 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
13320 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
13330 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
13340 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13350 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13360 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13370 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13390 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
133a0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
133b0 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
133c0 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
133d0 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
133e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
133f0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13400 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
13410 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
13420 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
13430 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13440 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13450 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13470 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13480 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13490 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
134d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
134e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
134f0 20 20 69 66 28 20 6e 50 61 67 65 48 65 61 64 65    if( nPageHeade
13500 72 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20  r>nPageFile ){. 
13510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13520 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13530 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13540 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13550 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
13560 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
13570 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13580 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13590 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
135a0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
135b0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
135c0 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
135d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
135f0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
13600 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
13610 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
13620 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
13630 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
13640 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
13650 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
13660 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
13670 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
13680 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
13690 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
136a0 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
136b0 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
136c0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
136d0 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
136e0 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
136f0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
13700 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
13710 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
13720 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
13730 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
13740 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
13750 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
13760 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
13770 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
13780 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
13790 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
137a0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
137b0 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
137c0 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
137d0 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
137e0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
137f0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
13800 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
13810 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
13820 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
13830 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
13840 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
13850 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
13860 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
13870 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
13880 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
13890 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
138a0 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
138b0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
138c0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
138d0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
138e0 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
138f0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
13900 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
13910 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
13920 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
13930 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
13940 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
13950 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
13960 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
13970 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
13980 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
13990 20 2d 20 32 33 29 3b 0a 20 20 61 73 73 65 72 74   - 23);.  assert
139a0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
139b0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
139c0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
139d0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
139e0 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
139f0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
13a00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
13a10 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13a20 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
13a30 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
13a40 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
13a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13a60 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
13a70 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
13a80 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
13a90 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
13aa0 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
13ab0 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
13ac0 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
13ad0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
13ae0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
13af0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
13b00 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
13b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13b20 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
13b30 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
13b40 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
13b50 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
13b60 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
13b70 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
13b80 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
13b90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
13ba0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
13bb0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
13bc0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13be0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13bf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
13c00 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
13c10 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  r==0 || pBt->inT
13c20 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
13c30 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
13c40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13c50 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
13c60 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
13c70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13c80 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
13c90 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
13ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
13cb0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
13cc0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
13cd0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
13ce0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
13cf0 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
13d00 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
13d10 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
13d20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
13d30 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
13d40 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
13d50 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
13d60 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
13d70 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
13d80 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
13d90 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
13da0 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
13db0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
13dc0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
13dd0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
13de0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
13df0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
13e00 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
13e10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
13e20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13e30 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
13e40 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
13e50 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13e60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13e70 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
13e80 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
13e90 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
13ea0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
13eb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13ec0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
13ed0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
13ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
13ef0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
13f00 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
13f10 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
13f20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13f30 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
13f40 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
13f50 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
13f60 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
13f70 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
13f80 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
13f90 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
13fa0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
13fb0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
13fc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
13fd0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
13fe0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
13ff0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
14000 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
14010 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
14020 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
14030 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14040 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
14050 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
14060 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
14070 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
14080 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
14090 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
140a0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
140b0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
140c0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
140d0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
140e0 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
140f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
14100 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
14110 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
14120 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
14130 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
14140 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
14150 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
14160 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
14170 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
14180 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
14190 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
141a0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
141b0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
141c0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
141d0 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
141e0 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
141f0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
14200 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14210 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
14220 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
14230 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
14240 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
14250 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
14260 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
14270 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
14280 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
14290 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
142a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
142b0 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
142c0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
142d0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
142e0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
142f0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
14300 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
14310 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
14320 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
14330 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
14340 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
14350 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
14360 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
14370 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
14380 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
14390 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
143a0 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
143b0 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
143c0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
143d0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
143e0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
143f0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
14400 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
14410 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
14420 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
14430 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14440 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
14450 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
14460 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14470 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
14480 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
14490 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
144a0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
144b0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
144c0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
144d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
144e0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
144f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
14500 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
14510 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
14520 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
14530 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
14540 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14550 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
14560 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
14570 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
14580 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
14590 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
145a0 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
145b0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
145c0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
145d0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
145e0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
145f0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
14600 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
14610 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
14620 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
14630 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
14640 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
14650 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
14660 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
14670 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
14680 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
14690 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
146a0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
146b0 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
146c0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
146d0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
146e0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
146f0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
14700 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
14710 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
14720 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
14730 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
14740 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
14750 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
14760 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
14770 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
14780 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
14790 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
147a0 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
147b0 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
147c0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
147d0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
147e0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
147f0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
14800 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
14810 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
14820 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
14830 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
14840 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
14850 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
14860 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
14870 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
14880 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
14890 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
148a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
148b0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
148c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
148d0 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
148e0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
148f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14900 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
14910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
14920 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14930 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
14940 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
14950 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
14960 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
14970 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
14980 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
14990 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
149a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
149b0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
149c0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
149d0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
149e0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
149f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
14a00 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
14a10 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
14a20 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
14a30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
14a40 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
14a50 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
14a60 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
14a70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
14a80 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
14a90 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
14aa0 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
14ab0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14ac0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
14ad0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
14ae0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
14af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14b00 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
14b10 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
14b20 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
14b30 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
14b40 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14b50 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
14b60 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
14b70 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
14b80 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
14b90 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
14ba0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
14bb0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
14bc0 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
14bd0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
14be0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
14bf0 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50  ITE) || pBt->isP
14c00 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42  ending ){.    pB
14c10 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
14c20 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
14c30 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
14c40 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
14c50 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
14c60 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
14c70 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
14c80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
14c90 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
14ca0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
14cb0 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
14cc0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
14cd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14ce0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
14cf0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
14d00 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
14d10 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
14d20 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
14d30 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
14d40 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
14d50 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
14d60 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
14d70 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
14d80 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
14d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
14da0 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
14db0 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
14dc0 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
14dd0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
14de0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
14df0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
14e00 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
14e10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14e20 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
14e30 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
14e40 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
14e50 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
14e60 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
14e70 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
14e80 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
14e90 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
14ea0 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74  t->initiallyEmpt
14eb0 79 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 6e 50  y = (u8)(pBt->nP
14ec0 61 67 65 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b 0a  age==0);.  do {.
14ed0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
14ee0 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
14ef0 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
14f00 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
14f10 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
14f20 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
14f30 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
14f40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
14f50 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
14f60 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
14f70 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
14f80 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
14f90 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
14fa0 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
14fb0 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
14fc0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
14fd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
14fe0 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
14ff0 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
15000 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
15010 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
15020 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
15030 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
15040 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
15050 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
15060 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
15070 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
15080 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
15090 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
150a0 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
150b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
150c0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
150d0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
150e0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
150f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15100 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
15110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
15120 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15130 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
15140 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
15150 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
15160 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
15170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15180 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
15190 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
151a0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
151b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
151c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
151d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
151e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
151f0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
15200 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
15210 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
15220 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
15230 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
15240 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
15250 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
15260 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
15270 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15280 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
15290 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
152a0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
152b0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
152c0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
152d0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
152e0 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
152f0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61  ->sharable ){..a
15300 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
15310 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
15320 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
15330 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
15340 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
15350 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
15360 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
15370 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
15380 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
15390 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
153a0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
153b0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
153c0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
153d0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
153e0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
153f0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
15400 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
15410 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
15420 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
15430 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
15440 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
15450 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
15460 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
15470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15480 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
15490 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
154a0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
154b0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
154c0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73  p;.      pBt->is
154d0 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29  Exclusive = (u8)
154e0 28 77 72 66 6c 61 67 3e 31 29 3b 0a 23 65 6e 64  (wrflag>1);.#end
154f0 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
15500 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
15510 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
15520 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
15530 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
15540 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
15550 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
15560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15570 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
15580 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
15590 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
155a0 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
155b0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
155c0 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
155d0 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
155e0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
155f0 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
15600 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
15610 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
15620 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
15630 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
15640 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
15650 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15660 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
15670 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
15680 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
15690 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
156a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
156b0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
156c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
156d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
156e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
156f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
15700 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
15710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15720 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
15730 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
15740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15750 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15760 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
15770 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
15780 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
15790 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
157a0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
157b0 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
157c0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
157d0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
157e0 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
157f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15800 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
15810 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
15820 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
15830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
15840 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
15850 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
15860 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
15870 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
15880 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
15890 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
158a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
158b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
158c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
158d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
158e0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
158f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
15900 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
15910 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
15920 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
15930 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
15940 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
15950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
15960 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
15970 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
15980 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
15990 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
159a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
159b0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
159c0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
159d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
15a00 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
15a10 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
15a40 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
15a50 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15a80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
15a90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
15aa0 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
15ab0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
15ac0 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
15ad0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
15ae0 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
15af0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15b00 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
15b10 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  tex) );.  rc = b
15b20 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
15b30 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
15b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15b50 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
15b60 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
15b70 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
15b80 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
15b90 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
15ba0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
15bb0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
15bc0 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d  e, i);..    ptrm
15bd0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
15be0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ge, pCell, &rc);
15bf0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
15c00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
15c10 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
15c20 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
15c30 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  ;.      ptrmapPu
15c40 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
15c50 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
15c60 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
15c70 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
15c80 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
15c90 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
15ca0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
15cb0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
15cc0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
15cd0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
15ce0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
15cf0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
15d00 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f   &rc);.  }..set_
15d10 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15d20 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
15d30 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
15d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15d50 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
15d60 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
15d70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
15d80 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
15d90 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
15da0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
15db0 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
15dc0 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
15dd0 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
15de0 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
15df0 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
15e00 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
15e10 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
15e20 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
15e30 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
15e40 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
15e50 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
15e60 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
15e70 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
15e80 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
15e90 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
15ea0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
15eb0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
15ec0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
15ee0 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
15ef0 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
15f00 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
15f10 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
15f20 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
15f30 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
15f40 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
15f50 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
15f80 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
15f90 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
15fa0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
15fb0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
15fc0 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
15fd0 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
15fe0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15ff0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
16000 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
16010 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16020 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
16030 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
16040 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
16050 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
16060 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
16070 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
16080 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
16090 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
160a0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
160b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
160c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
160d0 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
160e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
160f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16100 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
16110 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
16120 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
16130 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
16140 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
16150 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
16160 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
16170 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
16180 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
16190 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
161a0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
161b0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
161c0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
161d0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
161e0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
161f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
16200 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
16210 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
16220 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
16230 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
16240 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
16250 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
16260 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
16270 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
16280 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
16290 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
162a0 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
162b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
162c0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
162d0 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
162e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
162f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16300 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
16310 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
16320 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
16330 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
16340 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
16350 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
16360 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16370 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16380 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
16390 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
163a0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
163b0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
163c0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
163d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
163e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
163f0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
16400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16410 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16420 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
16430 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
16440 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
16450 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
16460 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
16470 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
16480 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
16490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
164a0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
164b0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
164c0 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
164d0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
164e0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
164f0 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
16500 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
16510 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
16520 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
16530 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
16540 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
16550 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
16560 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
16570 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
16580 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
16590 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
165a0 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
165b0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
165c0 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
165d0 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
165e0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
165f0 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
16600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
16610 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
16620 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
16630 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
16640 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
16650 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
16660 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
16670 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16690 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
166a0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
166b0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
166c0 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
166d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
166e0 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
166f0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
16700 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
16710 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
16720 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
16730 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
16740 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
16750 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
16760 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
16770 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
16780 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
16790 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
167a0 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
167b0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
167c0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
167d0 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
167e0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
167f0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
16800 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16810 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
16820 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
16830 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
16840 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
16850 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16860 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
16870 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
16880 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
16890 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
168a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
168b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
168c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
168d0 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
168e0 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
168f0 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
16900 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
16910 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
16920 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
16930 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
16940 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
16950 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
16960 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
16970 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
16980 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
16990 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
169a0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
169b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
169c0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
169d0 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
169e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
169f0 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
16a00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16a10 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16a20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
16a30 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
16a40 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
16a50 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
16a60 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
16a70 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
16a80 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
16a90 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
16aa0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
16ab0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
16ac0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
16ad0 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
16ae0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
16af0 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
16b00 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
16b10 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
16b20 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
16b30 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
16b40 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
16b50 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
16b60 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
16b70 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
16b80 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
16b90 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
16ba0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
16bb0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
16bc0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
16bd0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
16be0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
16bf0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
16c00 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
16c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
16c20 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
16c30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
16c40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16c50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16c60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
16c70 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
16c80 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
16c90 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
16ca0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
16cb0 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
16cc0 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
16cd0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
16ce0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
16cf0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
16d00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16d10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16d20 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16d30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
16d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
16d50 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
16d60 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
16d70 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
16d80 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
16d90 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
16da0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
16db0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
16dc0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
16dd0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
16de0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
16df0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
16e00 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
16e10 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
16e20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
16e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
16e50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16e70 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
16e80 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
16e90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
16eb0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
16ec0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
16ed0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
16ee0 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
16ef0 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
16f00 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
16f10 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
16f20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
16f30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
16f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16f50 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
16f60 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
16f70 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
16f80 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
16f90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16fa0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
16fb0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
16fc0 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
16fd0 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
16fe0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
16ff0 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
17000 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
17010 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
17020 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
17030 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
17040 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
17050 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
17060 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
17070 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
17080 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
17090 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
170a0 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74  fore no.** point
170b0 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   in calling this
170c0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
170d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
170e0 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  DONE..**.** More
170f0 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
17100 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
17110 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
17120 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ze the .** datab
17130 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
17140 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
17150 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
17160 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20  in use.** is no 
17170 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
17180 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e  *.** If the nFin
17190 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
171a0 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
171b0 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ction assumes.**
171c0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
171d0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
171e0 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
171f0 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
17200 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
17210 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
17220 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
17230 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
17240 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
17250 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
17260 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
17270 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
17280 73 20 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20  s complete.  If 
17290 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74  nFin is zero, it
172a0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
172b0 0a 2a 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74  .** incrVacuumSt
172c0 65 70 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c  ep() will be cal
172d0 6c 65 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f  led a finite amo
172e0 75 6e 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20  unt of times.** 
172f0 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
17300 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66   not empty the f
17310 72 65 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c  reelist.  A full
17320 20 61 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68   autovacuum.** h
17330 61 73 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50  as nFin>0.  A "P
17340 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61  RAGMA incrementa
17350 6c 5f 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46  l_vacuum" has nF
17360 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  in==0..*/.static
17370 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
17380 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
17390 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
173a0 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50  no iLastPg){.  P
173b0 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
173c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
173d0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
173e0 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
173f0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
17400 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17410 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17420 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
17430 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
17440 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
17450 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
17460 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
17470 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
17480 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
17490 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
174a0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
174b0 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
174c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
174d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
174e0 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
174f0 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
17500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17510 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
17520 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
17530 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
17540 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
17550 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
17560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17570 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17580 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
17590 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
175a0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
175b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
175c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
175d0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
175e0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
175f0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
17600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
17610 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
17620 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
17630 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
17640 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
17650 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
17660 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
17670 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
17680 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
17690 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
176a0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
176b0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
176c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
176d0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
176e0 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
176f0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
17700 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
17710 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
17720 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
17730 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
17740 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
17750 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
17760 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
17770 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
17780 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
17790 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
177a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
177b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
177c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
177d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
177e0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
177f0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
17800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
17810 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
17820 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
17830 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17850 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
17860 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
17870 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
17880 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
17890 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
178a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
178b0 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
178c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
178d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
178e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
178f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
17900 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
17910 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
17920 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
17930 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
17940 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
17950 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
17960 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
17970 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
17980 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
17990 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
179a0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
179b0 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
179c0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
179d0 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
179e0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
179f0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
17a00 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
17a10 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
17a20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
17a30 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
17a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
17a50 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
17a60 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
17a70 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
17a80 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
17a90 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
17aa0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
17ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17ad0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
17ae0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
17af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
17b10 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
17b20 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
17b30 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
17b40 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
17b50 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
17b60 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
17b70 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
17b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17b90 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
17ba0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
17bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17bc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
17bd0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
17be0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
17bf0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
17c00 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
17c10 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
17c20 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
17c30 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17c50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17c70 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20  ..  if( nFin==0 
17c80 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  ){.    iLastPg--
17c90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61  ;.    while( iLa
17ca0 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
17cb0 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
17cc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17cd0 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
17ce0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
17cf0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
17d00 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  g) ){.        Me
17d10 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20  mPage *pPg;.    
17d20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
17d30 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
17d40 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
17d50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17d70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17da0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
17db0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
17dc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
17dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17df0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17e00 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
17e10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73      }.      iLas
17e20 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  tPg--;.    }.   
17e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
17e40 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
17e50 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29  pPager, iLastPg)
17e60 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
17e70 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
17e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17e90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
17ea0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
17eb0 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
17ec0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
17ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
17ee0 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
17ef0 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
17f00 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
17f10 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
17f20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
17f30 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17f40 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
17f50 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
17f60 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
17f70 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
17f80 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
17f90 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
17fa0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
17fb0 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
17fc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
17fd0 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
17fe0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
17ff0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18000 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
18010 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
18020 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
18030 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
18040 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18050 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
18060 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18070 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
18080 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
18090 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
180a0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
180b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
180c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
180d0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c  }else{.    inval
180e0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
180f0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
18100 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
18110 74 65 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65  tep(pBt, 0, btre
18120 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29  ePagecount(pBt))
18130 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18160 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
18170 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
18180 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
18190 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
181a0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
181b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
181c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
181d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
181e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
181f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18200 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
18210 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
18220 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
18230 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64  n.** is commited
18240 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
18250 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
18260 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
18270 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
18280 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
18290 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
182a0 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
182b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
182c0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
182d0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
182e0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
182f0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
18300 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
18310 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
18320 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
18330 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
18340 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
18350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
18360 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
18370 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
18380 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18390 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
183a0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
183b0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
183c0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
183d0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
183e0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
183f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18400 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18410 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
18420 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
18430 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
18440 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
18450 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
18460 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
18470 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
18480 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18490 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
184a0 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
184b0 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
184c0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
184d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
184e0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
184f0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
18500 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  y */.    Pgno nP
18510 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e  trmap;      /* N
18520 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
18530 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
18540 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  d */.    Pgno iF
18550 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
18560 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
18570 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
18580 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
18590 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
185a0 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
185b0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
185c0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
185d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
185e0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
185f0 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
18600 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
18610 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
18620 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
18630 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
18640 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
18650 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18660 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
18670 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
18680 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
18690 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
186a0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
186b0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
186c0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
186d0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
186e0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
186f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
18700 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
18710 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
18720 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
18730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18740 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18750 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
18760 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
18770 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
18780 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79  36]);.    nEntry
18790 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
187a0 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61  ze/5;.    nPtrma
187b0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
187c0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
187d0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
187e0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e  y)/nEntry;.    n
187f0 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
18800 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
18810 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
18820 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18830 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
18840 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
18850 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
18860 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  --;.    }.    wh
18870 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
18880 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
18890 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
188a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
188b0 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
188c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69     }.    if( nFi
188d0 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
188e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
188f0 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69  BKPT;..    for(i
18900 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
18910 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
18920 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
18930 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
18940 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
18950 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a  , nFin, iFree);.
18960 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
18970 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
18980 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
18990 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
189a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
189b0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
189c0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
189d0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
189e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
189f0 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
18a00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
18a10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
18a20 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
18a30 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
18a40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
18a50 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
18a60 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
18a70 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
18a80 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20  Pager, nFin);.  
18a90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
18aa0 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
18ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
18ad0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
18ae0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
18af0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
18b00 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
18b10 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
18b20 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
18b30 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
18b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18b50 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
18b60 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
18b70 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
18b80 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
18b90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18ba0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
18bb0 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
18bc0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
18bd0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
18be0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
18bf0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
18c00 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
18c10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
18c20 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
18c30 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
18c40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
18c50 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
18c60 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
18c70 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
18c80 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
18c90 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
18ca0 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
18cb0 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
18cc0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
18cd0 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
18ce0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
18cf0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
18d00 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
18d10 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
18d20 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
18d30 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
18d40 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
18d50 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
18d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
18d70 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
18d80 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
18d90 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
18da0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
18db0 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
18dc0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
18dd0 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
18de0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
18df0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
18e00 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
18e10 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
18e20 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
18e30 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
18e40 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
18e50 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
18e60 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
18e70 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
18e80 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
18e90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
18ea0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
18eb0 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
18ec0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
18ed0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
18ee0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
18ef0 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
18f00 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
18f10 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
18f20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
18f30 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
18f40 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
18f50 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
18f60 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
18f70 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
18f80 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
18f90 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
18fa0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
18fb0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
18fc0 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
18fd0 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
18fe0 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
18ff0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
19000 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
19010 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
19020 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
19030 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
19040 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
19050 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
19060 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
19070 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
19080 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
19090 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
190a0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
190b0 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
190c0 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
190d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
190e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
190f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
19100 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
19110 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
19120 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19130 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
19140 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19150 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
19160 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19170 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19180 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
19190 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
191a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
191b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
191c0 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
191d0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
191e0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
191f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19200 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19210 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19220 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
19230 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
19240 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
19250 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
19260 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
19270 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
19280 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
19290 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
192a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
192b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
192c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
192d0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
192e0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
192f0 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
19300 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
19310 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
19320 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
19330 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
19340 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
19350 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
19360 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19370 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
19380 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
19390 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62  Mutex(p) );..  b
193a0 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
193b0 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20  ent(pBt);.  if( 
193c0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
193d0 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e  _NONE && p->db->
193e0 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20  activeVdbeCnt>1 
193f0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
19400 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
19410 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
19420 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
19430 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
19440 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
19450 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
19460 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
19470 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
19480 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
19490 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
194a0 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
194b0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
194c0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
194d0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
194e0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
194f0 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
19500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19510 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
19520 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
19530 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
19540 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
19550 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
19560 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
19570 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
19580 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19590 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
195a0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
195b0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
195c0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
195d0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
195e0 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
195f0 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
19600 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
19610 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
19620 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
19630 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
19640 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
19650 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
19660 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
19670 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
19680 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
19690 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
196a0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
196b0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
196c0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
196d0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
196e0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
196f0 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
19700 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
19710 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
19720 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
19730 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
19740 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
19750 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
19760 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
19770 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
19780 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
19790 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
197a0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
197b0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
197c0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
197d0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
197e0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
197f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19800 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
19810 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
19820 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
19830 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
19840 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
19850 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
19860 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
19870 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
19880 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
19890 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
198a0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
198b0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
198c0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
198d0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
198e0 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
198f0 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
19900 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
19910 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
19920 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
19930 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
19940 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
19950 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
19960 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
19970 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
19980 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
19990 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
199a0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
199b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
199c0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
199d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
199e0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
199f0 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
19a00 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
19a10 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
19a20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19a30 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
19a40 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
19a50 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
19a60 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
19a70 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
19a80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19a90 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
19aa0 28 42 74 72 65 65 20 2a 70 29 7b 0a 0a 20 20 69  (Btree *p){..  i
19ab0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
19ac0 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
19ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19ae0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19af0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
19b00 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
19b10 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
19b20 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
19b30 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
19b40 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
19b50 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
19b60 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
19b70 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
19b80 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
19b90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
19ba0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19bb0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
19bc0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
19bd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19be0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
19bf0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
19c00 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
19c10 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
19c20 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
19c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19c40 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
19c50 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
19c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19c90 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
19ca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19cb0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
19cc0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
19cd0 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
19ce0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
19cf0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19d00 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19d20 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
19d30 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
19d40 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19d50 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
19d60 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
19d70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19d80 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
19d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19da0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
19db0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19dd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
19de0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
19df0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
19e00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
19e20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
19e30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19e40 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
19e50 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
19e60 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
19e70 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
19e80 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
19e90 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
19ea0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
19eb0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
19ec0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
19ed0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
19ee0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
19ef0 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
19f00 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
19f10 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
19f20 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
19f30 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
19f40 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
19f50 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
19f60 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
19f70 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
19f80 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
19f90 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
19fa0 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
19fb0 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
19fc0 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
19fd0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
19fe0 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
19ff0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1a000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
1a010 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
1a020 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
1a030 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
1a040 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
1a050 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
1a060 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
1a070 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1a080 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1a090 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1a0a0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1a0b0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1a0c0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1a0d0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1a0e0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1a0f0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
1a100 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
1a110 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1a120 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
1a130 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
1a140 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
1a150 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
1a160 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
1a170 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1a180 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1a190 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
1a1a0 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
1a1b0 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
1a1c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a1d0 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
1a1e0 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
1a1f0 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
1a200 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
1a210 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
1a220 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
1a230 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
1a240 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
1a250 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
1a260 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1a270 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
1a280 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
1a290 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
1a2a0 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
1a2b0 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
1a2c0 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
1a2d0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
1a2e0 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
1a2f0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
1a300 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
1a310 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a320 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1a330 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
1a340 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
1a350 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1a360 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a370 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1a380 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1a390 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1a3a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1a3b0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1a3c0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1a3d0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1a3e0 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1a3f0 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1a400 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1a410 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1a420 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1a430 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a440 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1a450 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1a460 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1a470 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a480 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1a490 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1a4a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a4b0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1a4c0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1a4d0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1a4e0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1a4f0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1a500 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1a510 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1a520 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1a530 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1a540 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1a550 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1a560 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1a570 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1a580 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a590 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1a5a0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1a5b0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1a5c0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1a5d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1a5e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a5f0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1a600 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1a610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a620 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1a630 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1a640 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a650 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
1a660 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1a670 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
1a680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1a690 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
1a6a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a6b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1a6c0 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
1a6d0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
1a6e0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1a6f0 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
1a700 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
1a710 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
1a720 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
1a730 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
1a740 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
1a750 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
1a760 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
1a770 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
1a780 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
1a790 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
1a7a0 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
1a7b0 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
1a7c0 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
1a7d0 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
1a7e0 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
1a7f0 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
1a800 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
1a810 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
1a820 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
1a830 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
1a840 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
1a850 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
1a860 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
1a870 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
1a880 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1a890 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
1a8a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
1a8b0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1a8c0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1a8d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a8e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1a8f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1a900 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1a910 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1a920 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1a930 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1a940 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1a950 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1a960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1a970 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1a980 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1a990 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1a9a0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1a9b0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1a9c0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1a9d0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1a9e0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1a9f0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1aa00 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1aa10 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1aa20 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1aa30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1aa40 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1aa50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aa60 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1aa70 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1aa80 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1aa90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1aaa0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1aab0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1aac0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1aad0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1aae0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1aaf0 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1ab00 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1ab10 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1ab20 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1ab30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1ab40 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1ab50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
1ab60 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
1ab70 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1ab80 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1ab90 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
1aba0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1abb0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1abc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1abd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1abe0 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
1abf0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1ac00 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1ac10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
1ac20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
1ac30 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
1ac40 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
1ac50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
1ac60 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
1ac70 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
1ac80 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
1ac90 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1aca0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1acb0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
1acc0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
1acd0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1ace0 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
1acf0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
1ad00 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
1ad10 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1ad20 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
1ad30 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
1ad40 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
1ad50 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
1ad60 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
1ad70 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
1ad80 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
1ad90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
1ada0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
1adb0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
1adc0 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
1add0 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1ade0 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1adf0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1ae00 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1ae10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1ae20 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1ae30 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1ae40 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1ae50 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1ae60 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1ae70 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1ae80 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1ae90 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1aea0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1aeb0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1aec0 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1aed0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1aee0 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1aef0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1af00 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1af10 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1af20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1af30 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1af40 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1af50 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1af60 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1af70 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1af80 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1af90 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1afa0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1afb0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1afc0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1afd0 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1afe0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1aff0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1b000 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1b010 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b020 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b030 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1b040 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1b050 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1b060 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61  assert( pBt->rea
1b070 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
1b080 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
1b090 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1b0a0 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
1b0b0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
1b0c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1b0d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b0e0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
1b0f0 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
1b100 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
1b110 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
1b120 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
1b130 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
1b140 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
1b150 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
1b160 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
1b170 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
1b180 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
1b190 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
1b1a0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1b1b0 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
1b1c0 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
1b1d0 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
1b1e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
1b1f0 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1b200 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
1b210 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1b220 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1b230 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
1b240 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b250 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b260 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b270 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1b280 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1b290 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
1b2a0 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
1b2b0 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
1b2c0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
1b2d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
1b2e0 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
1b2f0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
1b300 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
1b310 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1b320 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
1b330 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1b340 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
1b350 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
1b360 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
1b370 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
1b380 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
1b390 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
1b3a0 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
1b3b0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
1b3c0 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
1b3d0 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
1b3e0 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
1b3f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
1b400 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1b410 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
1b420 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
1b430 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
1b440 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
1b450 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
1b460 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
1b470 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
1b480 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
1b490 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
1b4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1b4b0 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
1b4c0 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
1b4d0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
1b4e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b4f0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
1b500 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1b510 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1b520 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b530 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
1b540 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
1b550 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
1b560 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
1b570 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
1b580 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
1b590 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
1b5a0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1b5b0 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
1b5c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b5d0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
1b5e0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
1b5f0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b600 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
1b610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b630 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
1b640 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69  <0 && pBt->initi
1b650 61 6c 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d  allyEmpty ) pBt-
1b660 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1b670 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1b680 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1b690 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1b6a0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1b6b0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1b6c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1b6d0 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1b6e0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1b6f0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1b700 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1b710 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1b720 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1b730 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1b740 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1b750 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1b760 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1b770 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1b780 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1b790 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1b7a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1b7b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b7c0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1b7d0 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1b7e0 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1b7f0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1b800 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1b810 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1b820 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1b830 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1b840 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1b850 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1b860 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1b870 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1b880 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1b890 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1b8a0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1b8b0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1b8c0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1b8d0 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1b8e0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1b8f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1b900 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1b910 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1b920 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1b930 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1b940 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1b950 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1b960 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1b970 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1b980 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1b990 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1b9a0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1b9b0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1b9c0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1b9d0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1b9e0 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1b9f0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1ba00 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1ba10 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1ba20 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1ba30 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1ba40 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1ba50 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1ba60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1ba70 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1ba80 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1ba90 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1baa0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1bab0 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1bac0 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1bad0 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1bae0 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1baf0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1bb00 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1bb10 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1bb20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1bb30 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1bb40 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1bb50 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1bb60 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1bb70 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1bb80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1bb90 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1bba0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1bbb0 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1bbc0 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1bbd0 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1bbe0 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1bbf0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1bc00 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1bc10 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1bc20 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1bc30 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1bc40 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1bc50 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1bc60 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1bc70 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1bc80 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1bc90 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1bca0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1bcb0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1bcc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1bcd0 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1bce0 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1bcf0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1bd00 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1bd10 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1bd20 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1bd30 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1bd40 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1bd50 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1bd80 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1bd90 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1bdc0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1bdd0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1be00 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1be10 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1be20 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1be30 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1be40 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1be50 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1be60 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1be70 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1bea0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1beb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1bec0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1bed0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1bee0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1bef0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1bf00 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1bf10 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1bf20 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1bf30 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1bf40 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1bf50 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1bf60 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1bf70 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1bf80 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1bf90 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1bfa0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1bfb0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1bfc0 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1bfd0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1bfe0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1bff0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1c000 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1c010 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1c020 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1c030 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1c040 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1c050 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1c060 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1c070 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1c080 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1c090 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1c0a0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1c0b0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1c0c0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1c0d0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1c0e0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1c0f0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1c100 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1c110 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1c120 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1c130 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c140 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1c150 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1c160 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1c170 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1c180 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1c190 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
1c1a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c1b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1c1c0 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1c1d0 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
1c1e0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1c1f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c200 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20  E_EMPTY;.  }..  
1c210 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1c220 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1c230 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1c240 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1c250 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1c260 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1c270 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1c280 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1c290 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1c2a0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1c2b0 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1c2c0 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1c2d0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1c2e0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1c2f0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1c300 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1c310 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1c320 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1c330 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1c340 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1c350 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1c360 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1c370 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1c380 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1c390 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1c3a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1c3b0 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1c3c0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1c3d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c3e0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1c3f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1c400 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c430 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1c440 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1c470 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1c480 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1c490 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1c4c0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1c4d0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1c4e0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1c4f0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1c500 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1c510 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1c520 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1c530 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1c560 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1c570 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1c580 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1c590 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1c5a0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1c5b0 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1c5c0 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1c5d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c5e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c5f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c600 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1c610 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1c620 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1c630 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1c640 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1c650 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1c660 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1c670 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1c680 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1c690 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1c6a0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1c6b0 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1c6c0 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1c6d0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1c6e0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1c6f0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1c700 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1c710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c720 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1c730 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1c740 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1c750 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1c760 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1c770 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
1c780 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1c790 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1c7a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
1c7b0 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
1c7c0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
1c7d0 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
1c7e0 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
1c7f0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
1c800 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
1c810 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
1c820 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
1c830 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1c840 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
1c850 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
1c860 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
1c870 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
1c880 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
1c890 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
1c8a0 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
1c8b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c8c0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1c8d0 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1c8e0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
1c8f0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
1c900 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
1c910 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1c920 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1c930 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1c940 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1c950 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1c960 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1c970 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1c980 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1c990 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1c9a0 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1c9b0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1c9c0 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1c9d0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1c9e0 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1c9f0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1ca00 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1ca10 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1ca20 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1ca30 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1ca40 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1ca50 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1ca60 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1ca70 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1ca80 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1ca90 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1caa0 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1cab0 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1cac0 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1cad0 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1cae0 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1caf0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1cb00 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1cb10 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1cb20 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1cb30 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1cb40 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1cb50 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1cb60 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1cb70 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1cb80 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1cb90 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1cba0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1cbb0 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1cbc0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1cbd0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1cbe0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1cbf0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1cc00 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1cc10 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1cc20 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1cc30 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1cc40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1cc50 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1cc60 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1cc70 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1cc80 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1cc90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1cca0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1ccb0 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1ccc0 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1ccd0 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1cce0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1ccf0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1cd00 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1cd10 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1cd20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1cd30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1cd40 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1cd50 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1cd60 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1cd70 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1cd80 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1cd90 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1cda0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1cdb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cdc0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1cdd0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1cde0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1cdf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ce00 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1ce10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ce20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1ce30 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1ce40 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1ce50 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1ce60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ce70 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1ce80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ce90 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1cea0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1ceb0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1cec0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1ced0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1cee0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1cef0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1cf00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1cf10 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1cf20 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1cf30 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1cf40 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1cf50 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1cf60 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1cf70 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1cf80 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1cf90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1cfa0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1cfb0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1cfc0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1cfd0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1cfe0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1cff0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1d000 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1d010 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1d020 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1d030 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1d040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d050 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d060 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1d070 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1d080 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1d090 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1d0a0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1d0b0 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1d0c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1d0d0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1d0e0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1d0f0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1d100 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1d110 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1d120 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1d130 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1d140 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1d150 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1d160 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1d170 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1d180 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1d190 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1d1a0 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1d1b0 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1d1c0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1d1d0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1d1e0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1d1f0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1d200 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1d210 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1d220 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1d230 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1d240 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1d250 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1d260 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1d270 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1d280 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1d290 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1d2a0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1d2b0 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1d2c0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1d2d0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1d2e0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1d2f0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1d300 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1d310 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1d320 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1d330 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1d340 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1d350 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1d360 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1d370 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1d380 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1d390 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1d3a0 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1d3b0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1d3c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1d3d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1d3e0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1d3f0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1d400 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1d410 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1d420 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1d430 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1d440 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1d450 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1d460 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1d470 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1d480 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1d490 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1d4a0 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1d4b0 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1d4c0 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1d4d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1d4e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1d4f0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1d500 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1d510 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1d520 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1d530 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1d540 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1d550 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1d560 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1d570 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1d580 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1d590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d5a0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1d5b0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1d5c0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1d5d0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1d5e0 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1d5f0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1d600 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1d610 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1d620 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1d630 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1d640 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1d680 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1d690 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1d6d0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1d6e0 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1d720 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1d730 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1d740 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1d750 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1d760 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1d770 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7b0 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1d810 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1d860 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1d870 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
1d880 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
1d890 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
1d8a0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1d8b0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
1d8c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1d8d0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
1d8e0 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
1d8f0 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
1d900 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
1d910 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1d920 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
1d930 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
1d940 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
1d950 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
1d960 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1d970 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1d980 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1d990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d9a0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1d9b0 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1d9c0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1d9d0 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
1d9e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
1d9f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
1da00 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
1da10 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1da20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
1da30 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
1da40 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
1da50 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
1da60 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
1da70 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
1da80 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
1da90 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
1daa0 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
1dab0 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
1dac0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
1dad0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
1dae0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
1daf0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
1db00 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
1db10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1db20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
1db30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1db40 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
1db50 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
1db60 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1db70 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
1db80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1db90 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
1dba0 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1dbb0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
1dbc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1dbd0 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1dbe0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1dbf0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1dc00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1dc10 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1dc20 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1dc30 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1dc40 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1dc50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1dc60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1dc70 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
1dc80 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20  D ){.    *pSize 
1dc90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1dca0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1dcb0 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ur);.    *pSize 
1dcc0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1dcd0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1dce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1dcf0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1dd00 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1dd10 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1dd20 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1dd30 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1dd40 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
1dd50 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1dd60 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
1dd70 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1dd80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
1dd90 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
1dda0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
1ddb0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
1ddc0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
1ddd0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
1dde0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1ddf0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
1de00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1de10 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
1de20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
1de30 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
1de40 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1de50 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
1de60 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
1de70 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
1de80 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
1de90 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
1dea0 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
1deb0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
1dec0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
1ded0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
1dee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1def0 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
1df00 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
1df10 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1df20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1df30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1df40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1df50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1df60 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1df70 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
1df80 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1df90 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53  Data;.  return S
1dfa0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1dfb0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
1dfc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
1dfd0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dfe0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
1dff0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
1e000 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1e010 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
1e020 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1e030 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1e040 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1e050 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1e060 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1e070 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1e080 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1e090 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1e0a0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1e0b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1e0c0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1e0d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1e0e0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1e0f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1e100 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1e110 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1e120 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e130 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1e140 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1e150 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1e160 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1e170 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1e180 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1e190 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1e1a0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1e1b0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1e1c0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1e1d0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1e1e0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1e1f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1e200 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1e210 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1e220 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1e230 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1e240 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1e250 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1e260 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1e270 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1e280 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1e290 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1e2a0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1e2b0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1e2c0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1e2d0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1e2e0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1e2f0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1e300 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1e310 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1e320 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1e330 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1e340 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1e350 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1e360 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1e370 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1e380 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1e390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e3b0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
1e3e0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1e3f0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
1e400 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
1e410 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
1e420 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
1e430 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
1e440 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
1e450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1e460 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
1e470 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1e480 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
1e490 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1e4a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
1e4b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e4c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e4d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e4e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1e4f0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
1e500 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1e510 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e520 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
1e530 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
1e540 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1e550 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
1e560 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
1e570 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e580 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
1e590 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
1e5a0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
1e5b0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
1e5c0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
1e5d0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
1e5e0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
1e5f0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
1e600 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
1e610 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
1e620 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
1e630 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
1e640 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
1e650 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
1e660 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1e670 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1e680 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
1e690 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
1e6a0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
1e6b0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1e6c0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
1e6d0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
1e6e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e6f0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
1e700 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
1e710 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
1e720 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1e730 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1e740 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1e750 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
1e760 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1e770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e780 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
1e790 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
1e7a0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
1e7b0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
1e7c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
1e7d0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e7e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1e7f0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1e800 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
1e810 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1e820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e830 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
1e840 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1e850 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29  ovfl, &pPage, 0)
1e860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1e870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1e880 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
1e890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e8a0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1e8b0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1e8c0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1e8d0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1e8e0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1e8f0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1e900 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1e910 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1e920 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1e930 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1e940 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1e950 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1e960 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1e970 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1e980 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1e990 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1e9a0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1e9b0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1e9c0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1e9d0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1e9e0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1e9f0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1ea00 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1ea10 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1ea20 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1ea30 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1ea40 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1ea50 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1ea60 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1ea70 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1ea80 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1ea90 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1eaa0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1eab0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1eac0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1ead0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1eae0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1eaf0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1eb00 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1eb10 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1eb20 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1eb30 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1eb40 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1eb50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1eb60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1eb70 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1eb80 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1eb90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1eba0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1ebb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ebd0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ebe0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1ebf0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1ec00 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1ec10 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1ec20 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1ec30 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1ec40 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1ec50 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1ec60 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1ec70 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1ec80 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1ec90 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1eca0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1ecb0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1ecc0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1ecd0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1ece0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ecf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ed00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ed10 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1ed20 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1ed30 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1ed40 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1ed50 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1ed60 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1ed70 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1ed80 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1ed90 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1eda0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1edb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1edc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1edd0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1ede0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1edf0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1ee00 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1ee10 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1ee20 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ee30 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1ee40 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1ee50 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1ee60 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1ee70 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1ee80 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1ee90 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1eea0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1eeb0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1eec0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1eed0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1eee0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1eef0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1ef00 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1ef10 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1ef20 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1ef30 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1ef40 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
1ef50 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
1ef60 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
1ef70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
1ef80 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
1ef90 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
1efa0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
1efb0 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
1efc0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1efd0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1efe0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1eff0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1f000 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1f010 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1f020 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1f030 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1f040 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1f050 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1f060 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1f070 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1f080 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1f090 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1f0a0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1f0b0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1f0c0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1f0d0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1f0e0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1f0f0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1f100 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1f110 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1f120 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1f130 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1f140 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1f150 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1f160 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1f170 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1f180 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1f190 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1f1a0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1f1b0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1f1c0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1f1d0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1f1e0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1f1f0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1f200 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f210 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1f220 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1f230 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1f240 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1f250 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1f260 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1f270 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1f280 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1f290 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1f2a0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1f2b0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1f2c0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1f2d0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1f2e0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1f2f0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1f300 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1f310 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1f320 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1f330 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1f340 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1f350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1f360 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1f370 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1f380 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1f390 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1f3a0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1f3b0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
1f3c0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1f3d0 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
1f3e0 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
1f3f0 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
1f400 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
1f410 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
1f420 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20  QLITE_OK;.  u32 
1f430 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78  nKey;.  int iIdx
1f440 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1f450 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
1f460 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f470 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
1f480 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
1f490 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
1f4a0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1f4b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f4c0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
1f4d0 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
1f4e0 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
1f4f0 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
1f500 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f510 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f530 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1f540 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
1f550 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1f560 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f570 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
1f580 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1f590 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1f5a0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
1f5b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
1f5c0 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
1f5d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
1f5e0 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  : (int)pCur->inf
1f5f0 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
1f600 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74  NEVER(offset+amt
1f610 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
1f620 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c  fo.nData) .   ||
1f630 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
1f640 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
1f650 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
1f660 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
1f670 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1f680 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1f690 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1f6a0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1f6b0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1f6c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f6d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1f6e0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
1f6f0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
1f700 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
1f710 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
1f720 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
1f730 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
1f740 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1f750 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1f760 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
1f770 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1f780 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
1f790 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1f7a0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
1f7b0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
1f7c0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
1f7d0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
1f7e0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
1f7f0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
1f800 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
1f810 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
1f820 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1f830 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
1f840 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
1f850 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1f860 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1f870 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
1f880 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
1f890 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
1f8a0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
1f8b0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
1f8c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
1f8d0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
1f8e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1f8f0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1f900 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
1f910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f920 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1f930 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
1f940 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1f950 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
1f960 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1f970 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
1f980 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1f990 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
1f9a0 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
1f9b0 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
1f9c0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
1f9d0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
1f9e0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1f9f0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
1fa00 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
1fa10 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
1fa20 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
1fa30 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
1fa40 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
1fa50 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
1fa60 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
1fa70 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
1fa80 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
1fa90 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
1faa0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
1fab0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
1fac0 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
1fad0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
1fae0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1faf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
1fb00 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
1fb10 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
1fb20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
1fb30 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
1fb40 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
1fb50 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
1fb60 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1fb70 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
1fb80 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f  *nOvfl);.      /
1fb90 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79  * nOvfl is alway
1fba0 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20  s positive.  If 
1fbb0 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65  it were zero, fe
1fbc0 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64  tchPayload would
1fbd0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62   have.      ** b
1fbe0 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64  een used instead
1fbf0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1fc00 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  . */.      if( A
1fc10 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20  LWAYS(nOvfl) && 
1fc20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1fc30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fc40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1fc50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fc60 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
1fc70 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1fc80 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1fc90 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
1fca0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
1fcb0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
1fcc0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
1fcd0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
1fce0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
1fcf0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
1fd00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1fd10 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
1fd20 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
1fd30 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
1fd40 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
1fd50 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
1fd60 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1fd70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1fd80 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
1fd90 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
1fda0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
1fdb0 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
1fdc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fdd0 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
1fde0 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
1fdf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fe00 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1fe10 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
1fe20 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
1fe30 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1fe40 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
1fe50 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1fe60 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1fe70 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
1fe80 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
1fe90 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
1fea0 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
1feb0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
1fec0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1fed0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
1fee0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1fef0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
1ff00 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1ff10 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
1ff20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
1ff30 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
1ff40 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
1ff50 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1ff60 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
1ff70 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1ff80 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
1ff90 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
1ffa0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
1ffb0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
1ffc0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
1ffd0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
1ffe0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
1fff0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
20000 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
20010 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
20020 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
20030 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
20040 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
20050 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
20060 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
20070 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
20080 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20090 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
200a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
200b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
200c0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
200d0 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
200e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
200f0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
20100 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
20110 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
20120 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
20130 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
20140 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
20150 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
20160 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
20170 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
20180 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
20190 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
201a0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
201b0 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
201c0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
201d0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
201e0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
201f0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
20200 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
20210 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20220 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
20230 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
20240 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
20250 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20270 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
20280 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
20290 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
202a0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
202b0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
202c0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
202d0 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
202e0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
202f0 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
20300 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
20310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20320 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
20330 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
20340 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
20350 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
20360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20370 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
20380 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
20390 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
203a0 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
203b0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
203c0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
203d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
203e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
203f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
20400 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
20410 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20420 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
20430 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
20440 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
20450 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
20460 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
20470 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
20480 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
20490 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
204a0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
204b0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
204c0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
204d0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
204e0 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
204f0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
20500 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
20510 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
20520 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20530 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
20540 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
20550 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
20560 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
20570 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
20580 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
20590 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
205a0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
205b0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
205c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
205d0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
205e0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
205f0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
20600 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
20610 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20620 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20630 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20640 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20660 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
20670 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20680 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
20690 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
206a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
206b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
206c0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
206d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
206e0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
206f0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
20700 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
20710 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
20720 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
20730 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
20740 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
20750 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
20760 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
20770 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
20780 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
20790 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
207a0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
207b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
207c0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
207d0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
207e0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
207f0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
20800 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
20810 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
20820 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
20830 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
20840 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
20850 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20860 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
20870 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
20880 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
20890 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
208a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
208b0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
208c0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
208d0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
208e0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
208f0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
20900 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
20910 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20920 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20930 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
20940 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
20950 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
20970 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
20980 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20990 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
209a0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
209b0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
209c0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
209d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
209e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
209f0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
20a00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
20a10 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
20a20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
20a30 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
20a40 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
20a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20a60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
20a70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
20a80 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
20a90 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
20aa0 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
20ab0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
20ac0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
20ad0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
20ae0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
20af0 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
20b00 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
20b10 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
20b20 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
20b30 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
20b40 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
20b50 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
20b60 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
20b70 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
20b80 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
20b90 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
20ba0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
20bb0 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
20bc0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
20bd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
20be0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
20bf0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
20c00 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
20c10 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
20c20 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
20c30 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
20c40 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
20c50 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
20c60 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
20c70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
20c80 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
20c90 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
20ca0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
20cb0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
20cc0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
20cd0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
20ce0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
20cf0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
20d00 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
20d10 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
20d20 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
20d30 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
20d40 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
20d50 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
20d60 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
20d70 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
20d80 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
20d90 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
20da0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
20db0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
20dc0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
20dd0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
20de0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
20df0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
20e00 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
20e10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
20e20 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
20e30 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
20e40 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
20e50 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
20e60 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
20e70 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
20e80 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
20e90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
20ea0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
20eb0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
20ec0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
20ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
20ee0 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
20ef0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
20f00 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
20f10 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
20f20 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
20f30 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
20f40 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
20f50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
20f60 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
20f70 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
20f80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20f90 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
20fa0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20fb0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
20fc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20fd0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20fe0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
20ff0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21000 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
21010 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21020 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
21030 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e  nCell );.  if( N
21040 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  EVER(pCur->info.
21050 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20  nSize==0) ){.   
21060 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
21070 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21080 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  r->iPage], pCur-
21090 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
210a0 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
210b0 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69          &pCur->i
210c0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79  nfo);.  }.  aPay
210d0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
210e0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
210f0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
21100 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
21110 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
21120 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
21130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
21140 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
21150 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
21160 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
21170 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
21180 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
21190 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
211a0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
211b0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
211c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
211d0 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  cal;.    assert(
211e0 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b   nLocal<=nKey );
211f0 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
21200 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
21210 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
21220 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
21230 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
21240 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
21250 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
21260 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
21270 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
21280 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
21290 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
212a0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
212b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
212c0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
212d0 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
212e0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
212f0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
21300 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
21310 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
21320 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
21330 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
21340 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
21350 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
21360 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
21370 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
21380 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
21390 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
213a0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
213b0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
213c0 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
213d0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
213e0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
213f0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
21400 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
21410 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
21420 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
21430 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
21440 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
21450 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
21460 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
21470 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
21480 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
21490 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
214a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
214b0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
214c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
214d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
214e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
214f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21510 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
21520 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21530 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
21540 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
21550 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
21560 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
21570 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
21580 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
21590 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
215a0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
215b0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
215c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
215d0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
215e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
215f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
21600 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
21610 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21620 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21630 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
21640 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21650 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
21660 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
21670 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
21680 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
21690 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
216a0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
216b0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
216c0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
216d0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
216e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
216f0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
21700 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
21710 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
21720 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21730 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
21740 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
21750 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
21760 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
21770 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
21780 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
21790 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
217a0 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
217b0 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
217c0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
217d0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
217e0 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
217f0 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
21800 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
21810 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
21820 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
21830 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
21840 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
21850 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
21860 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
21870 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
21880 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
21890 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
218a0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
218b0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
218c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
218d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
218e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
218f0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
21900 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69  MAX_DEPTH );.  i
21910 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
21920 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
21930 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
21940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
21960 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
21970 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
21980 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20  , &pNewPage);.  
21990 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
219a0 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
219b0 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
219c0 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
219d0 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
219e0 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
219f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
21a00 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
21a10 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
21a20 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
21a30 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65  ll<1 || pNewPage
21a40 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
21a50 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65  apPage[i]->intKe
21a60 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
21a70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21a80 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
21a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21aa0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
21ab0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
21ac0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
21ad0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
21ae0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
21af0 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
21b00 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
21b10 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
21b20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
21b30 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
21b40 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
21b50 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
21b60 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
21b70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
21b80 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
21b90 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
21ba0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
21bb0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
21bc0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
21bd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
21be0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
21bf0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
21c00 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
21c10 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
21c20 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
21c30 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
21c40 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
21c50 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
21c60 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
21c70 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
21c80 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
21c90 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
21ca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
21cb0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
21cc0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
21cd0 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
21ce0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
21cf0 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
21d00 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
21d10 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
21d20 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21d30 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
21d40 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
21d50 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
21d60 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
21d70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
21d80 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
21d90 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
21da0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
21db0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
21dc0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
21dd0 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
21de0 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
21df0 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
21e00 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
21e10 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
21e20 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
21e30 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
21e40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21e50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21e60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21e70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21e80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21e90 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
21ea0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
21eb0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
21ec0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
21ed0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
21ee0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
21ef0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
21f00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21f10 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
21f20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21f30 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
21f40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21f50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
21f60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
21f70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21f80 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
21f90 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
21fa0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
21fb0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
21fc0 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
21fd0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
21fe0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
21ff0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
22000 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
22010 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
22020 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
22030 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
22040 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22050 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
22060 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
22070 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
22080 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
22090 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
220a0 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
220b0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
220c0 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
220d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
220e0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
220f0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
22100 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
22110 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
22120 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
22130 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
22140 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
22150 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
22160 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
22170 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
22180 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
22190 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
221a0 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
221b0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
221c0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
221d0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
221e0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
221f0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
22200 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
22210 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
22220 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
22230 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
22240 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
22250 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
22260 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
22270 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
22280 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
22290 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
222a0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
222b0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
222c0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
222d0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
222e0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
222f0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
22300 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
22310 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
22320 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
22330 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
22340 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
22350 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
22360 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
22370 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
22380 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
22390 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
223a0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
223b0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
223c0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
223d0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
223e0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
223f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
22400 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
22410 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
22420 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
22430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22440 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
22450 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
22460 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22470 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
22480 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22490 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
224a0 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
224b0 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
224c0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
224d0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
224e0 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
224f0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
22500 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
22510 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
22520 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
22530 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
22540 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
22550 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
22560 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22570 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
22580 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22590 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
225a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
225b0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
225c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
225d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
225e0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
225f0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
22600 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
22610 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
22620 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
22630 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
22640 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
22650 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
22660 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
22670 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
22680 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
22690 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
226a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
226b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
226c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
226d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
226e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
226f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
22700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22710 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
22720 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  >iPage = 0;..   
22730 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
22740 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
22750 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
22760 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
22770 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a  his cursor.    *
22780 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
22790 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
227a0 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
227b0 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
227c0 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c   is.    ** NULL,
227d0 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
227e0 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
227f0 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
22800 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20  ot the case,.   
22810 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
22820 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
22830 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  or.  */.    asse
22840 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22850 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  [0]->intKey==1 |
22860 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  | pCur->apPage[0
22870 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  ]->intKey==0 );.
22880 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70      if( (pCur->p
22890 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75  KeyInfo==0)!=pCu
228a0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
228b0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
228c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
228d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
228e0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74    }..  /* Assert
228f0 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70   that the root p
22900 61 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f  age is of the co
22910 72 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73  rrect type. This
22920 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a   must be the.  *
22930 2a 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61  * case as the ca
22940 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
22950 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20  ion that loaded 
22960 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65  the root-page (e
22970 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20  ither.  ** this 
22980 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f  call or a previo
22990 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77  us invocation) w
229a0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
229b0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20  ed corruption . 
229c0 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d   ** if the assum
229d0 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ption were not t
229e0 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e  rue, and it is n
229f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
22a00 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20  the flags .  ** 
22a10 62 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65  byte to have bee
22a20 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  n modified while
22a30 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20   this cursor is 
22a40 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
22a50 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  nce.  ** to the 
22a60 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f  page.  */.  pRoo
22a70 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
22a80 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
22a90 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
22aa0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20  ->pgnoRoot );.  
22ab0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
22ac0 73 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e  sInit && (pCur->
22ad0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52  pKeyInfo==0)==pR
22ae0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a  oot->intKey );..
22af0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
22b00 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
22b10 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22b20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
22b30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
22b40 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
22b50 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
22b60 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
22b70 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
22b80 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
22b90 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
22ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22bb0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
22bc0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
22bd0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
22be0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
22bf0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
22c00 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
22c10 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
22c20 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
22c30 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
22c40 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
22c50 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e  tate = ((pRoot->
22c60 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
22c70 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
22c80 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ALID);.  }.  ret
22c90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22ca0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
22cb0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
22cc0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
22cd0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
22ce0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
22cf0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
22d00 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
22d10 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
22d20 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
22d30 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
22d40 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
22d50 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
22d60 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
22d70 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
22d80 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
22d90 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
22da0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22db0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
22dc0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
22dd0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22de0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22df0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22e00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22e10 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
22e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22e30 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
22e40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22e50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
22e60 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22e70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22e80 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
22e90 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
22ea0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
22eb0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
22ec0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22ed0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
22ee0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
22ef0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
22f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22f10 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22f20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
22f30 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
22f40 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
22f50 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
22f60 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
22f70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
22f80 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
22f90 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
22fa0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
22fb0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
22fc0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
22fd0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
22fe0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
22ff0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
23000 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
23010 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
23020 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
23030 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
23040 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
23050 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
23060 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
23070 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
23080 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
23090 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
230a0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
230b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
230c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
230d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
230e0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
230f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23100 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
23110 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
23120 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23130 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23140 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23150 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23160 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
23170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23180 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
23190 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
231a0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
231b0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
231c0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
231d0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
231e0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
231f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23200 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
23210 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
23220 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
23230 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
23240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23250 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
23260 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23270 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
23280 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
23290 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
232a0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
232b0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
232c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
232d0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
232e0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
232f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
23300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
23310 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
23320 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
23330 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
23340 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
23350 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
23360 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
23370 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
23380 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
23390 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
233a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
233b0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
233c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
233d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
233e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
233f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23400 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
23410 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
23420 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
23430 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
23440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23450 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
23460 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
23470 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
23480 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23490 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
234a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
234b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
234c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
234d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
234e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
234f0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
23500 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
23510 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
23520 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
23530 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
23550 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
23560 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
23570 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
23580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
23590 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
235a0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
235b0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
235c0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
235d0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
235e0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
235f0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
23600 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
23610 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
23620 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
23630 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
23640 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
23650 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23660 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23670 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23680 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
23690 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
236a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
236b0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
236c0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
236d0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
236e0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
236f0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
23700 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
23710 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a  pCur->atLast ){.
23720 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23730 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
23740 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
23750 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
23760 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
23770 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
23780 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
23790 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
237a0 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
237b0 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
237c0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
237d0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
237e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
237f0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
23800 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
23810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23820 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
23830 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
23840 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23850 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
23860 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23870 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23880 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
23890 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
238a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
238b0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
238c0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
238d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
238e0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
238f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
23900 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
23910 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23920 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23930 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
23940 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23950 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23960 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23970 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23980 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
23990 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
239a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
239b0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
239c0 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
239d0 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
239e0 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
239f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23a00 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
23a10 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
23a20 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
23a30 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
23a40 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
23a50 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
23a60 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
23a70 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
23a80 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
23a90 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
23aa0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
23ab0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
23ac0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
23ad0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
23ae0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
23af0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
23b00 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
23b10 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
23b20 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
23b30 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23b40 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
23b50 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
23b60 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
23b70 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
23b80 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
23b90 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
23ba0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
23bb0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
23bc0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
23bd0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
23be0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
23bf0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
23c00 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
23c10 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
23c20 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
23c30 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
23c40 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
23c50 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
23c60 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
23c70 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
23c80 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
23c90 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
23ca0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
23cb0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
23cc0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
23cd0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
23ce0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
23cf0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
23d00 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
23d10 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
23d20 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
23d30 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
23d40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
23d50 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
23d60 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
23d70 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
23d80 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
23d90 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
23da0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
23db0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
23dc0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
23de0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
23df0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
23e00 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
23e10 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
23e20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
23e30 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
23e40 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23e50 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
23e60 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
23e70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
23e80 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
23e90 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
23ea0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
23eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
23ec0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
23ed0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
23ee0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
23ef0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
23f00 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
23f10 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
23f20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
23f30 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
23f40 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
23f50 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
23f60 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
23f70 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
23f80 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
23f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
23fa0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
23fb0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
23fc0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
23fd0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23fe0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23ff0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24000 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
24010 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
24020 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
24030 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
24040 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
24050 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
24060 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
24070 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
24080 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
24090 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
240a0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
240b0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
240c0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
240d0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
240e0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
240f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24100 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
24110 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
24120 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
24130 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
24140 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
24150 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
24160 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
24170 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
24180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24190 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
241a0 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
241b0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
241c0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
241d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
241e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
241f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
24200 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
24210 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24220 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24230 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
24240 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24250 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
24260 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24270 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
24280 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
24290 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
242a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
242b0 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ll>0 || pCur->eS
242c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
242d0 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
242e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
242f0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
24300 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
24310 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24320 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24330 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
24340 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24350 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
24360 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24370 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
24380 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
24390 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
243a0 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
243b0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
243c0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
243d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
243e0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
243f0 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   c;..    /* pPag
24400 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
24410 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
24420 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
24430 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
24440 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
24450 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
24460 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
24470 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
24480 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
24490 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
244a0 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
244b0 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
244c0 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
244d0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
244e0 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
244f0 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
24500 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
24510 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
24520 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
24530 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
24540 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
24550 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
24560 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
24570 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
24580 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
24590 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
245a0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
245b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
245c0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
245d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
245e0 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
245f0 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
24600 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
24610 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
24620 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
24630 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
24640 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
24650 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20  = (u16)upr;.    
24660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
24670 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24680 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75  Page] = (u16)((u
24690 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20  pr+lwr)/2);.    
246a0 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  }.    for(;;){. 
246b0 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
246c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
246d0 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65  >iPage]; /* Inde
246e0 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c  x of current cel
246f0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  l in pPage */.  
24700 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
24730 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
24740 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
24750 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
24760 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
24770 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
24780 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
24790 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
247a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
247b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
247c0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
247d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  llKey;.        i
247e0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
247f0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
24800 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
24810 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
24820 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
24830 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
24840 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
24850 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
24860 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
24870 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
24880 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
24890 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
248a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
248b0 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
248c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
248d0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
248e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
248f0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
24900 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
24910 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
24920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75     }.        pCu
24930 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
24940 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
24950 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
24960 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lKey;.      }els
24970 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
24980 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
24990 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
249a0 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
249b0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
249c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
249d0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
249e0 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
249f0 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
24a00 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
24a10 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
24a20 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
24a30 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
24a40 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
24a50 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
24a60 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
24a70 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
24a80 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
24a90 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
24aa0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
24ab0 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
24ac0 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
24ad0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
24ae0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
24af0 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
24b00 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
24b10 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
24b20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
24b30 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
24b40 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
24b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
24b60 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b  t nCell = pCell[
24b70 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
24b80 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20  !(nCell & 0x80) 
24b90 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  && nCell<=pPage-
24ba0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
24bb0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
24bc0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
24bd0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
24be0 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
24bf0 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
24c00 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
24c10 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
24c20 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
24c30 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
24c40 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
24c50 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
24c60 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24c70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24c80 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
24c90 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
24ca0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
24cb0 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
24cc0 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
24cd0 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
24ce0 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
24cf0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
24d00 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
24d10 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
24d20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
24d30 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
24d40 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
24d50 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
24d60 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
24d70 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
24d80 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
24d90 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
24da0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
24db0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24dc0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
24dd0 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
24de0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
24df0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
24e00 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
24e10 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
24e20 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
24e30 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
24e40 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
24e50 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
24e60 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
24e70 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
24e80 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
24e90 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
24ea0 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
24eb0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
24ec0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
24ed0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
24ee0 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
24ef0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
24f00 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
24f10 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
24f20 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
24f30 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
24f40 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
24f50 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
24f60 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
24f70 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
24f80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
24f90 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
24fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
24fb0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
24fc0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
24fd0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
24fe0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
24ff0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
25000 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
25010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25030 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
25040 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
25050 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
25060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
25070 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
25080 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
25090 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
250a0 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
250b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
250c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
250d0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
250e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
250f0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
25100 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25110 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
25120 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
25130 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
25140 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
25150 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25160 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
25170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25180 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
25190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
251a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
251b0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
251c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
251d0 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
251e0 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
251f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
25200 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25210 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
25220 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
25230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25240 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
25250 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
25260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25270 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
25280 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
25290 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
252a0 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
252b0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
252c0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
252d0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
252e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
252f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25300 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
25310 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
25320 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25330 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
25340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
25350 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
25360 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
25370 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
25380 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
25390 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
253a0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
253b0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
253c0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
253d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
253e0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
253f0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
25400 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
25410 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
25420 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
25430 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
25440 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25450 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25460 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
25470 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25480 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ll );.      *pRe
25490 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
254a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
254b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
254c0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
254d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
254e0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
254f0 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e  )lwr;.    pCur->
25500 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
25510 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
25520 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
25530 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
25540 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
25550 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
25560 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
25570 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
25580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25590 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
255a0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
255b0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
255c0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
255d0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
255e0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
255f0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
25600 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
25610 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
25620 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
25630 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
25640 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
25650 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
25660 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
25670 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
25680 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
25690 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
256a0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
256b0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
256c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
256d0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
256e0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
256f0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
25700 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
25710 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
25720 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
25730 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
25740 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
25750 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
25760 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
25770 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
25780 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
25790 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
257a0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
257b0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
257c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
257d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
257e0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
257f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25800 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
25810 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
25820 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
25830 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
25840 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
25850 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
25860 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
25870 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
25880 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
25890 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
258a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
258b0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
258c0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
258d0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
258e0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
258f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
25900 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25910 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25920 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
25930 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
25940 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
25950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
25970 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
25980 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
25990 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
259a0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
259b0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
259c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
259d0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
259e0 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
259f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
25a00 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
25a10 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
25a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25a30 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
25a40 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
25a50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25a60 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
25a70 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
25a80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
25a90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
25aa0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
25ab0 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
25ac0 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
25ad0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25ae0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
25af0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
25b00 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
25b10 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
25b20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
25b30 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
25b40 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
25b50 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
25b60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
25b70 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
25b80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25b90 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
25ba0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
25bb0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
25bc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
25bd0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
25be0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
25bf0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
25c00 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
25c10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
25c20 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
25c30 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
25c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
25c60 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
25c70 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
25c80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25c90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
25ca0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
25cb0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25cc0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
25cd0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
25ce0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
25cf0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25d00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25d10 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
25d20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25d30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d40 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
25d50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
25d60 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
25d70 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
25d80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25d90 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
25da0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
25db0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
25dc0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
25dd0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
25de0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
25df0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
25e00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
25e10 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
25e20 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
25e30 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
25e40 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
25e50 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
25e60 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
25e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
25e80 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
25e90 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
25ea0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
25eb0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
25ec0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
25ed0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
25ee0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
25ef0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
25f00 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
25f10 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25f20 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
25f30 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
25f40 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
25f50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
25f70 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
25f80 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
25f90 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
25fa0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
25fb0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
25fc0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
25fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
25fe0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
25ff0 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  t<0 ){.    pCur-
26000 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
26010 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
26020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26030 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
26040 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20  skipNext = 0;.. 
26050 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
26060 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26070 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
26080 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
26090 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
260a0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
260b0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
260c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
260d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
260e0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
260f0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
26100 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
26110 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
26120 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
26130 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
26140 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
26150 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
26160 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
26170 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
26180 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
26190 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
261a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
261b0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
261c0 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
261d0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
261e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
261f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
26200 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
26210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
26220 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
26230 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
26240 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20  idNKey = 0;..   
26250 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26260 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
26270 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
26280 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26290 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
262a0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
262b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
262c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
262d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
262e0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
262f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
26300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
26310 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
26320 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26330 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
26340 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
26350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26360 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
26370 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
26380 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
26390 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
263a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
263b0 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
263c0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
263d0 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
263e0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
263f0 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
26400 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
26410 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
26420 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
26430 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
26440 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
26450 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
26460 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
26470 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
26480 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
26490 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
264a0 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
264b0 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
264c0 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
264d0 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
264e0 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
264f0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
26500 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
26510 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
26520 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
26530 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
26540 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
26550 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
26560 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
26570 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
26580 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
26590 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
265a0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
265b0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
265c0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
265d0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
265e0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
265f0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
26600 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
26610 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
26620 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26630 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
26640 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
26650 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
26660 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
26670 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
26680 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
26690 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
266a0 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
266b0 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
266c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
266d0 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
266e0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
266f0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
26700 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
26710 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
26720 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
26730 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
26740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
26750 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
26760 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
26770 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
26780 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
26790 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
267a0 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
267b0 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
267c0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
267d0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
267e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
267f0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
26800 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
26810 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
26820 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
26830 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
26840 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
26850 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
26860 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
26870 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
26880 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
26890 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
268a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
268b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
268c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
268d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
268e0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
268f0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
26900 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
26910 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34  pBt);.  n = get4
26920 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
26930 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
26940 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
26950 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
26960 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
26970 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
26980 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
26990 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
269a0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
269b0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
269c0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
269d0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
269e0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
269f0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
26a00 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
26a10 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
26a20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
26a30 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
26a40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
26a50 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
26a60 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
26a70 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
26a80 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
26a90 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
26aa0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
26ab0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
26ac0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
26ad0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
26ae0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
26af0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
26b00 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
26b10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26b20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26b30 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
26b40 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
26b50 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
26b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
26b70 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
26b80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
26b90 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
26ba0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
26bb0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
26bc0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
26bd0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26be0 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
26bf0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
26c00 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
26c10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
26c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
26c30 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
26c40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
26c50 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
26c60 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
26c70 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
26c80 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
26c90 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
26ca0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
26cb0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
26cc0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
26cd0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
26ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26cf0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
26d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
26d10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
26d20 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
26d30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
26d40 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
26d50 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
26d60 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
26d70 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
26d80 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
26d90 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
26da0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
26db0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
26dc0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
26dd0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
26de0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
26df0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
26e00 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
26e10 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
26e20 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
26e30 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
26e40 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
26e50 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
26e60 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
26e70 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
26e80 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
26e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
26ea0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
26eb0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
26ec0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
26ed0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
26ee0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
26ef0 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
26f00 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
26f10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
26f20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
26f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26f40 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26f50 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
26f60 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
26f70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26f80 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
26f90 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
26fa0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
26fb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
26fc0 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
26fd0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
26fe0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
26ff0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
27000 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
27010 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
27020 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
27030 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
27040 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
27050 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
27060 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
27070 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
27080 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
27090 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
270a0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
270b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
270c0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
270d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
270e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
270f0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
27100 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
27110 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
27120 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
27130 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
27140 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
27150 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
27160 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
27170 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
27180 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
27190 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
271a0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
271b0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
271c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
271d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
271e0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
271f0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
27200 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
27210 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27220 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
27230 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
27240 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
27250 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
27260 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
27270 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
27280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27290 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
272a0 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
272b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
272c0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
272d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
272e0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
272f0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
27300 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
27310 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
27320 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
27330 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
27340 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
27350 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
27360 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
27370 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
27380 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
27390 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
273a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
273b0 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
273c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
273d0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
273e0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
273f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
27400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27410 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
27420 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
27430 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
27440 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27450 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27460 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
27470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27480 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
27490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
274a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
274b0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
274c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
274d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
274e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
274f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27500 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
27510 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27520 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27540 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27550 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
27560 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
27570 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
27580 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
27590 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
275a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
275b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
275c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
275d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
275e0 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
275f0 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
27600 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
27610 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
27620 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
27630 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
27640 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
27650 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
27660 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
27670 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
27680 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27690 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
276a0 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
276b0 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
276c0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
276d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
276e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
276f0 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
27700 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
27710 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
27720 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
27730 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
27740 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
27750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27760 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
27770 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
27780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
27790 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
277a0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
277b0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
277c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
277d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
277e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
277f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27810 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27820 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27830 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
27840 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
27850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
27870 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
27880 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
27890 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
278a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
278b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
278c0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
278d0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
278e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
278f0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
27900 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
27910 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
27920 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
27930 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
27940 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
27950 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
27960 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
27970 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
27980 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
27990 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
279a0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
279b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
279c0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
279d0 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
279e0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
279f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
27a00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
27a10 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
27a20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27a30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
27a40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27a50 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
27a60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
27a70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27a80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27a90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
27aa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
27ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
27ac0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
27ad0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
27ae0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
27af0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27b00 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
27b10 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
27b20 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
27b30 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
27b40 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
27b50 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
27b60 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
27b70 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
27b80 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
27b90 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
27ba0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
27bb0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
27bc0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
27bd0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
27be0 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
27bf0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
27c00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27c10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
27c20 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
27c30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
27c40 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
27c50 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
27c60 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
27c70 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
27c80 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
27c90 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
27ca0 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
27cb0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
27cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
27cd0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
27ce0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
27cf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
27d00 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
27d10 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
27d20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
27d30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
27d40 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
27d50 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
27d60 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
27d70 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
27d80 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
27d90 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
27da0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
27db0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
27dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27dd0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
27de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
27e00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
27e10 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
27e20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
27e30 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
27e40 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
27e50 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
27e60 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
27e70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
27e80 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
27e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
27ea0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
27eb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
27ec0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
27ed0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
27ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
27ef0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
27f00 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
27f10 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
27f20 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
27f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
27f40 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
27f50 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
27f60 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
27f70 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
27f80 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
27f90 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
27fa0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
27fb0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
27fc0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fe0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
27ff0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
28000 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
28010 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
28020 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
28030 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
28040 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
28050 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
28060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28070 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
28080 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
28090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
280a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
280b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 72  rIswriteable(pTr
280c0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  unk->pDbPage) );
280d0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
280e0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
280f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
28100 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  *pPgno);.       
28110 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
28120 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
28130 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
28140 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
28150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28160 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28180 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
28190 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
281a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
281b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
281c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
281d0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
281e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
281f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28200 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
28210 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
28220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
28230 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
28240 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
28250 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
28260 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
28270 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
28280 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
28290 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
282a0 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
282b0 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
282c0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
282d0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
282e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
282f0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
28300 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
28310 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
28320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
28330 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
28340 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
28350 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
28360 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
28370 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
28380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
28390 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
283a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
283b0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
283c0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
283d0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
283e0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
283f0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
28400 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
28410 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
28420 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
28430 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
28440 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
28450 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
28460 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
28470 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
28480 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
28490 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
284a0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
284b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
284c0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
284d0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
284e0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
284f0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
28500 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
28510 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
28520 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28530 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
28540 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
28550 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
28560 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28570 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
28580 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  &pPg, 1);.      
28590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
285a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
285b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
285c0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
285d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
285e0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
285f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
28600 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28610 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
28620 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
28630 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
28640 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
28650 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
28660 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
28670 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
28680 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
28690 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
286a0 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
286b0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
286c0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
286d0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
286e0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
286f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
28700 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
28710 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  o, ppPage, 1);. 
28720 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28730 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
28740 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28750 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
28760 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
28770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28780 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28790 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
287a0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
287b0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
287c0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
287d0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
287e0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
287f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
28800 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
28810 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
28820 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
28830 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
28840 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
28850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
28870 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
28880 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
28890 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
288a0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
288b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
288c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
288d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
288e0 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
288f0 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
28900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
28910 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
28920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28940 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
28950 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
28960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28970 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
28980 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
28990 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
289a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
289b0 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
289c0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
289d0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
289e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
289f0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
28a00 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
28a10 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
28a20 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
28a30 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
28a40 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
28a50 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
28a60 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
28a70 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
28a80 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
28a90 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
28aa0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
28ab0 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
28ac0 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
28ad0 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
28ae0 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
28af0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
28b00 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
28b10 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
28b20 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
28b30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
28b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
28b50 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
28b60 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
28b70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
28b80 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
28b90 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28bb0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
28bc0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
28bd0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28bf0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
28c00 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
28c10 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
28c20 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
28c30 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
28c40 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
28c50 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
28c60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
28c90 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
28ca0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
28cb0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28cd0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
28ce0 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
28d10 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
28d20 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
28d30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
28d40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28d50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
28d60 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
28d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
28d80 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
28d90 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
28da0 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
28db0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
28dc0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
28dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
28de0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
28df0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
28e00 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
28e10 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
28e20 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
28e30 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
28e40 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
28e50 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
28e60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28e70 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
28e80 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
28e90 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
28ea0 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
28eb0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28ec0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
28ed0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28ee0 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
28ef0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73  );..  if( pBt->s
28f00 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20  ecureDelete ){. 
28f10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
28f20 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
28f30 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
28f40 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
28f50 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
28f60 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
28f70 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
28f80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28f90 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
28fa0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28fb0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
28fc0 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
28fd0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
28fe0 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
28ff0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
29000 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
29010 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
29020 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29030 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
29040 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
29050 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
29060 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
29070 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
29080 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
29090 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
290a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
290b0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
290c0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
290d0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
290e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
290f0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
29100 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
29110 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
29120 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
29130 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
29140 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29150 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
29160 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
29170 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
29180 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
29190 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
291a0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
291b0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
291c0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
291d0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
291e0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
291f0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
29200 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
29210 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
29220 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
29230 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
29240 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
29250 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
29260 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
29270 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
29280 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
29290 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
292a0 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
292b0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
292c0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
292d0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
292e0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
292f0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
29300 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
29310 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29330 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
29340 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
29350 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
29360 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
29370 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29380 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
29390 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
293a0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
293b0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
293c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
293d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
293e0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
293f0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
29400 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
29410 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
29420 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
29430 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
29440 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
29450 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
29460 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
29470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
29480 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29490 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
294a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
294b0 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
294c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
294d0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
294e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
294f0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
29500 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
29510 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
29520 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
29530 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
29540 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
29550 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
29560 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
29570 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
29580 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
29590 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
295a0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
295b0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
295c0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
295d0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
295e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
295f0 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
29600 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
29610 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
29620 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
29630 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
29640 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
29650 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
29660 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
29670 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
29680 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
29690 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
296a0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
296b0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
296c0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
296d0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
296e0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
296f0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
29700 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
29710 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
29720 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
29730 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
29740 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
29750 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
29760 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
29770 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
29780 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
29790 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
297a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
297b0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
297c0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
297d0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
297e0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
297f0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
29800 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
29810 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
29820 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
29830 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29840 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29850 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
29860 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
29870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29880 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
29890 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
298a0 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
298b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
298c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
298d0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
298e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
298f0 67 65 20 26 26 20 21 70 42 74 2d 3e 73 65 63 75  ge && !pBt->secu
29900 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
29910 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
29920 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
29930 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
29940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
29950 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
29960 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
29970 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
29980 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
29990 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
299a0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
299b0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
299c0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
299d0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
299e0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
299f0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
29a00 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
29a10 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
29a20 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
29a30 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
29a40 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
29a50 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
29a60 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
29a70 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
29a80 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
29a90 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
29aa0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
29ab0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
29ac0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
29ad0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
29ae0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
29af0 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
29b00 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
29b10 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
29b20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
29b30 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
29b40 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
29b50 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
29b60 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
29b70 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
29b80 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
29b90 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
29ba0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
29bb0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29bc0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
29bd0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
29be0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
29bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29c00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
29c10 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
29c20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
29c30 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
29c40 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
29c50 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
29c60 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
29c70 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
29c80 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
29c90 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
29ca0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
29cb0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
29cc0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
29cd0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
29ce0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
29cf0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
29d00 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
29d10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
29d20 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
29d30 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
29d40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
29d50 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
29d60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
29d70 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
29d80 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
29d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
29da0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
29db0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
29dc0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
29dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
29de0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
29df0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
29e00 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
29e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29e20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
29e30 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
29e40 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
29e50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29e60 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
29e70 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
29e80 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
29e90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
29ea0 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
29eb0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
29ec0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29ed0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
29ee0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
29ef0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
29f00 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
29f10 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
29f20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
29f30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29f40 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
29f50 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
29f60 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
29f70 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
29f80 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
29f90 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
29fa0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
29fb0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
29fc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29fd0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
29fe0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
29ff0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2a000 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2a010 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2a020 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2a030 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2a040 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2a050 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2a060 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2a070 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2a080 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2a090 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2a0a0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2a0b0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2a0c0 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2a0d0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2a0e0 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2a0f0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2a100 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2a110 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2a120 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2a130 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2a140 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2a150 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2a160 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2a170 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2a180 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2a190 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2a1a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a1b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2a1c0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2a1d0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2a1e0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2a1f0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2a200 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2a210 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2a220 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2a230 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2a240 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2a250 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2a260 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2a270 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2a280 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2a290 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2a2a0 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2a2b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2a2c0 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2a2d0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2a2e0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2a2f0 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2a300 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2a310 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2a320 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2a330 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2a340 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2a350 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2a360 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2a370 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2a380 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2a390 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2a3a0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2a3b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2a3c0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2a3d0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2a3e0 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2a3f0 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2a400 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2a410 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2a420 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2a430 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2a440 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2a450 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2a460 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2a470 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2a480 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2a490 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2a4a0 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2a4b0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2a4c0 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2a4d0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2a4e0 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2a4f0 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2a500 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2a510 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2a520 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2a530 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2a540 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2a550 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2a560 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2a570 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2a580 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2a590 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a5a0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2a5b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a5c0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2a5d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2a5e0 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2a5f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2a600 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a610 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2a620 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2a630 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2a640 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2a650 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2a660 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2a670 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2a680 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2a690 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2a6a0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2a6b0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2a6c0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2a6d0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2a6e0 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2a6f0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2a700 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2a710 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2a720 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2a730 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2a740 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2a750 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2a760 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2a770 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2a780 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2a790 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2a7a0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2a7b0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2a7c0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2a7d0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2a7e0 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2a7f0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2a800 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2a810 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2a820 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2a830 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2a840 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2a850 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2a860 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2a870 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2a880 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2a890 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2a8a0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2a8b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2a8c0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2a8d0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2a8e0 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2a8f0 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2a900 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2a910 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a930 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2a940 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2a950 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2a960 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2a970 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2a980 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2a990 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2a9a0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2a9b0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2a9c0 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2a9d0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2a9e0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2a9f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2aa00 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2aa10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2aa20 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2aa30 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2aa40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2aa50 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2aa60 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2aa70 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2aa80 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
2aa90 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
2aaa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aab0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2aac0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2aad0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2aae0 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2aaf0 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2ab00 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2ab10 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2ab20 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2ab30 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2ab40 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2ab50 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2ab60 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2ab70 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2ab80 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2ab90 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2aba0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2abb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2abc0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2abd0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2abe0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2abf0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
2ac00 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2ac10 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2ac20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
2ac30 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
2ac40 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
2ac50 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2ac60 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
2ac70 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
2ac80 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
2ac90 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
2aca0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2acb0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2acc0 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
2acd0 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2ace0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2acf0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
2ad00 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
2ad10 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
2ad20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
2ad30 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
2ad40 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
2ad50 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
2ad60 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
2ad70 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
2ad80 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
2ad90 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
2ada0 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
2adb0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
2adc0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2add0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2ade0 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
2adf0 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
2ae00 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
2ae10 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
2ae20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ae30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ae40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2ae50 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
2ae60 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
2ae70 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
2ae80 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
2ae90 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
2aea0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
2aeb0 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
2aec0 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
2aed0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
2aee0 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
2aef0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2af00 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
2af10 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
2af20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
2af30 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
2af40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2af50 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
2af60 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
2af70 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
2af80 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
2af90 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
2afa0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2afb0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2afc0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
2afd0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
2afe0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
2aff0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
2b000 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2b010 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
2b020 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
2b030 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
2b040 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2b050 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
2b060 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2b070 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
2b080 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
2b090 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
2b0a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b0b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2b0c0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2b0d0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2b0e0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
2b0f0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
2b100 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
2b110 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
2b120 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
2b130 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
2b140 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2b150 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
2b160 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
2b170 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2b180 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2b190 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2b1a0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
2b1b0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
2b1c0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2b1d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
2b1e0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
2b1f0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
2b200 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
2b210 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
2b220 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
2b230 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
2b240 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
2b250 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
2b260 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
2b270 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
2b280 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
2b290 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
2b2a0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
2b2b0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
2b2c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2b2d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2b2e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b2f0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2b300 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
2b310 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
2b320 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
2b330 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
2b340 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2b350 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
2b360 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
2b370 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b380 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
2b390 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
2b3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b3b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2b3c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b3d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2b3e0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2b3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b400 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2b410 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2b420 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2b430 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
2b440 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2b450 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
2b460 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2b470 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2b480 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2b490 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2b4a0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2b4b0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2b4c0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2b4d0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2b4e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2b4f0 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
2b500 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2b510 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2b520 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2b530 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2b540 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2b550 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2b560 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
2b570 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
2b580 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2b590 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2b5a0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2b5b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b5c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2b5d0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
2b5e0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
2b5f0 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
2b600 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2b610 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
2b620 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
2b630 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
2b640 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
2b650 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2b660 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
2b670 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
2b680 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
2b690 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
2b6a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2b6b0 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
2b6c0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
2b6d0 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
2b6e0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
2b6f0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2b700 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2b710 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
2b720 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2b730 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
2b740 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2b750 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2b760 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2b770 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
2b780 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2b790 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2b7a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b7b0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2b7c0 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
2b7d0 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
2b7e0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2b7f0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2b800 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2b810 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
2b820 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2b830 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
2b840 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
2b850 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
2b860 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2b870 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2b880 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2b890 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b8a0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2b8b0 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
2b8c0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
2b8d0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
2b8e0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
2b8f0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
2b900 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
2b910 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
2b920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2b930 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
2b940 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
2b950 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
2b960 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
2b970 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
2b980 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
2b990 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
2b9a0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
2b9b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
2b9c0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
2b9d0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2b9e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
2b9f0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2ba00 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
2ba10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2ba20 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
2ba30 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2ba40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2ba50 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
2ba60 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
2ba70 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
2ba80 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
2ba90 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
2baa0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
2bab0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
2bac0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
2bad0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
2bae0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
2baf0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
2bb00 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2bb10 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2bb20 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
2bb30 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
2bb40 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
2bb50 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
2bb60 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
2bb70 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2bb80 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
2bb90 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69  t *pRC){.  int i
2bba0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
2bbb0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2bbc0 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2bbd0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2bbe0 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2bbf0 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2bc00 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2bc10 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2bc20 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2bc30 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2bc40 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2bc50 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2bc60 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
2bc70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2bc80 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
2bc90 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2bca0 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
2bcb0 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
2bcc0 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
2bcd0 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
2bce0 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
2bcf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ;..  assert( idx
2bd00 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
2bd10 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
2bd20 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
2bd30 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
2bd40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bd50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2bd60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2bd70 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
2bd80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2bd90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2bda0 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
2bdb0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2bdc0 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50    ptr = &data[pP
2bdd0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
2bde0 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  + 2*idx];.  pc =
2bdf0 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
2be00 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2be10 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
2be20 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
2be30 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2be40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2be50 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
2be60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2be70 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32  .  if( pc < (u32
2be80 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  )get2byte(&data[
2be90 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
2bea0 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
2beb0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
2bec0 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
2bed0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2bee0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
2bef0 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
2bf00 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
2bf10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
2bf20 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
2bf30 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
2bf40 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
2bf50 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
2bf60 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
2bf70 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
2bf80 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
2bf90 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2bfa0 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
2bfb0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
2bfc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
2bfd0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
2bfe0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  2;.}../*.** Inse
2bff0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
2c000 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
2c010 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
2c020 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
2c030 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
2c040 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
2c050 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2c060 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2c070 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
2c080 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
2c090 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
2c0a0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
2c0b0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
2c0c0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
2c0d0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
2c0e0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
2c0f0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
2c100 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
2c110 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
2c120 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
2c130 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2c140 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2c150 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2c160 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2c170 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2c180 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2c190 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2c1a0 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2c1b0 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2c1c0 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2c1d0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2c1e0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2c1f0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2c200 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2c210 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2c220 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2c230 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2c240 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2c250 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2c260 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2c270 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2c280 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2c290 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2c2a0 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2c2b0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2c2c0 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2c2d0 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2c2e0 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2c2f0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2c300 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2c310 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2c320 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2c330 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2c340 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2c350 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2c360 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2c370 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2c380 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2c390 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2c3a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2c3b0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2c3c0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2c3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2c3e0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2c3f0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2c400 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2c410 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2c420 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2c430 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2c440 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2c450 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2c460 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2c470 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2c480 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2c490 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2c4a0 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2c4b0 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2c4c0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2c4d0 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
2c4e0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2c4f0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2c500 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2c510 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2c520 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2c530 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2c540 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2c550 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2c560 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2c570 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2c580 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2c590 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2c5a0 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2c5b0 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2c5c0 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2c5d0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2c5e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2c5f0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2c600 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2c610 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2c620 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2c630 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2c640 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
2c650 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
2c660 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
2c670 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
2c680 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
2c690 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
2c6a0 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
2c6b0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2c6c0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2c6d0 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
2c6e0 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
2c6f0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
2c700 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2c710 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2c720 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2c730 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2c740 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
2c750 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2c760 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
2c770 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b  pPage->aOvfl) );
2c780 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c790 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2c7a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2c7b0 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
2c7c0 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
2c7d0 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
2c7e0 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
2c7f0 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
2c800 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
2c810 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
2c820 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
2c830 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
2c840 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
2c850 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
2c860 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
2c870 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
2c880 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
2c890 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
2c8a0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
2c8b0 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
2c8c0 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
2c8d0 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
2c8e0 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
2c8f0 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
2c900 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2c910 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
2c920 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2c930 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2c940 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
2c950 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
2c960 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
2c970 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
2c980 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
2c990 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
2c9a0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2c9b0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
2c9c0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2c9d0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2c9e0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
2c9f0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2ca00 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
2ca10 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
2ca20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
2ca30 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
2ca40 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
2ca50 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
2ca60 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
2ca70 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20  age->aOvfl[0])) 
2ca80 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
2ca90 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
2caa0 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
2cab0 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
2cac0 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b  (u16)i;.  }else{
2cad0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
2cae0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2caf0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2cb00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cb10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cb20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2cb30 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2cb40 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2cb50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2cb60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2cb70 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
2cb80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2cb90 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
2cba0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2cbb0 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
2cbc0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
2cbd0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  e->nCell;.    in
2cbe0 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
2cbf0 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61   2*i;.    rc = a
2cc00 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
2cc10 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
2cc20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
2cc30 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
2cc40 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
2cc50 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
2cc60 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
2cc70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2cc80 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  o properties.   
2cc90 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
2cca0 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20  s success */.   
2ccb0 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
2ccc0 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  end+2 );.    ass
2ccd0 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70  ert( idx+sz <= p
2cce0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2ccf0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
2cd00 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
2cd10 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2cd20 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
2cd30 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2cd40 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
2cd50 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2cd60 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  ip);.    if( iCh
2cd70 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2cd80 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
2cd90 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2cda0 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20  .    for(j=end, 
2cdb0 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
2cdc0 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
2cdd0 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
2cde0 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
2cdf0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
2ce00 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
2ce10 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
2ce20 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
2ce30 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
2ce40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
2ce50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2ce60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ce70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ce80 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
2ce90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2cea0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
2ceb0 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
2cec0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2ced0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2cee0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
2cef0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
2cf00 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2cf10 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
2cf20 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
2cf30 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
2cf40 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
2cf50 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
2cf60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
2cf70 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
2cf80 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
2cf90 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
2cfa0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
2cfb0 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
2cfc0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
2cfd0 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
2cfe0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
2cff0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
2d000 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
2d010 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2d020 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
2d030 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
2d040 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
2d050 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
2d060 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
2d070 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
2d080 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
2d090 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
2d0a0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
2d0b0 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
2d0c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2d0d0 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
2d0e0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2d0f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d100 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
2d110 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
2d120 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2d130 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
2d140 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
2d150 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2d160 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
2d170 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
2d180 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2d190 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2d1a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
2d1b0 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
2d1c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
2d1d0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2d1e0 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
2d1f0 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
2d200 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
2d210 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
2d220 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
2d230 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
2d240 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
2d250 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
2d260 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2d270 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
2d280 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d290 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2d2a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2d2b0 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
2d2c0 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  & nCell<=MX_CELL
2d2d0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2d2e0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2d2f0 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61  Bt)<=10921);.  a
2d300 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d310 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d320 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2d330 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2d340 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
2d350 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
2d360 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
2d370 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2d380 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2d390 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
2d3a0 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
2d3b0 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2d3c0 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2d3d0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2d3e0 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
2d3f0 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2d400 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2d410 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2d420 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c  ; i--){.    pCel
2d430 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
2d440 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65  ellbody -= aSize
2d450 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
2d460 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2d470 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2d480 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2d490 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
2d4a0 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ize[i]);.  }.  p
2d4b0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2d4c0 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2d4d0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2d4e0 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2d4f0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2d500 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2d510 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2d520 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2d530 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2d540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2d550 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2d560 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2d570 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2d580 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2d590 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2d5a0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2d5b0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2d5c0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2d5d0 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2d5e0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2d5f0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2d600 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2d610 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2d620 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2d630 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2d640 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2d650 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2d660 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2d670 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2d680 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2d690 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2d6a0 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2d6b0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2d6c0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2d6d0 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2d6e0 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2d6f0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2d700 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2d710 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2d720 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2d730 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2d740 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2d750 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2d760 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2d770 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2d780 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2d790 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2d7a0 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2d7b0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2d7c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2d7d0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2d7e0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2d7f0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2d800 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2d810 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2d820 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2d830 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2d840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2d850 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2d860 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2d870 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2d880 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2d890 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2d8a0 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2d8b0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2d8c0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2d8d0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2d8e0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2d8f0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2d900 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2d910 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2d920 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2d930 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2d940 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2d950 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68  ng to balance th
2d960 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
2d970 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
2d980 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
2d990 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
2d9a0 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
2d9b0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
2d9c0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
2d9d0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
2d9e0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
2d9f0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
2da00 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
2da10 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
2da20 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
2da30 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
2da40 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
2da50 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
2da60 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
2da70 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
2da80 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
2da90 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
2daa0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
2dab0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
2dac0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
2dad0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
2dae0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
2daf0 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
2db00 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
2db10 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
2db20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
2db30 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
2db40 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2db50 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
2db60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61  ..**.** The pSpa
2db70 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65  ce buffer is use
2db80 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d  d to store a tem
2db90 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74  porary copy of t
2dba0 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65  he divider.** ce
2dbb0 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
2dbc0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50  inserted into pP
2dbd0 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65  arent. Such a ce
2dbe0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
2dbf0 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20   4.** byte page 
2dc00 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20  number followed 
2dc10 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  by a variable le
2dc20 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e  ngth integer. In
2dc30 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
2dc40 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65   at most 13 byte
2dc50 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70  s. Hence the pSp
2dc60 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  ace buffer must 
2dc70 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31  be at.** least 1
2dc80 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  3 bytes in size.
2dc90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2dca0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
2dcb0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d  Page *pParent, M
2dcc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2dcd0 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74  8 *pSpace){.  Bt
2dce0 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42  Shared *const pB
2dcf0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20  t = pPage->pBt; 
2dd00 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74     /* B-Tree Dat
2dd10 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  abase */.  MemPa
2dd20 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  ge *pNew;       
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
2dd50 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ed page */.  int
2dd60 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd80 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2dd90 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
2dda0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2ddb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2ddc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65  ge number of pNe
2ddd0 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  w */..  assert( 
2dde0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2ddf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2de00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2de10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2de20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2de30 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2de40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2de50 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2de60 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f  ..  /* This erro
2de70 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  r condition is n
2de80 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
2de90 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
2dea0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
2deb0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  f( pPage->nCell<
2dec0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2ded0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2dee0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2def0 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73  a new page. This
2df00 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2df10 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c  e the right-sibl
2df20 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61  ing of .  ** pPa
2df30 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72  ge. Make the par
2df40 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c  ent page writabl
2df50 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  e, so that the n
2df60 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  ew divider cell.
2df70 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65    ** may be inse
2df80 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68  rted. If both th
2df90 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ese operations a
2dfa0 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  re successful, p
2dfb0 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72  roceed..  */.  r
2dfc0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2dfd0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
2dfe0 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30  , &pgnoNew, 0, 0
2dff0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2e000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
2e010 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61  u8 *pOut = &pSpa
2e020 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70  ce[4];.    u8 *p
2e030 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f  Cell = pPage->aO
2e040 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2e050 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
2e060 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2e070 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
2e080 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
2e090 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2e0a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
2e0b0 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
2e0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e0d0 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
2e0e0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2e0f0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
2e100 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2e110 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
2e120 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2e130 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
2e140 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
2e150 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
2e160 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
2e170 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2e180 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2e190 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2e1a0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
2e1b0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
2e1c0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
2e1d0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
2e1e0 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
2e1f0 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
2e200 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2e210 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
2e220 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
2e230 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
2e240 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
2e250 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
2e260 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
2e270 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2e280 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
2e290 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
2e2a0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
2e2b0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
2e2c0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
2e2d0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2e2e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
2e2f0 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
2e300 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
2e310 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
2e320 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
2e330 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
2e340 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
2e350 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
2e360 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
2e370 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2e380 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2e390 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2e3a0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
2e3b0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
2e3c0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
2e3d0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
2e3e0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
2e3f0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
2e400 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
2e410 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
2e420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2e430 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
2e440 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
2e450 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
2e460 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
2e470 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
2e480 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
2e490 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
2e4a0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
2e4b0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
2e4c0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2e4d0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
2e4e0 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
2e4f0 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
2e500 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
2e510 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
2e520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
2e530 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
2e540 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
2e550 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
2e560 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2e570 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2e580 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
2e590 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
2e5a0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
2e5b0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
2e5c0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
2e5d0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2e5e0 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
2e5f0 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
2e600 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
2e610 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
2e620 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
2e630 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
2e640 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
2e650 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
2e660 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
2e670 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
2e680 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
2e690 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
2e6a0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
2e6b0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
2e6c0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
2e6d0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
2e6e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
2e6f0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
2e700 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
2e710 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2e720 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
2e730 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
2e740 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2e750 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
2e760 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
2e770 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
2e780 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2e790 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2e7a0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
2e7b0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
2e7c0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2e7d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
2e7e0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2e7f0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
2e800 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
2e810 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
2e820 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
2e830 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
2e840 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
2e850 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
2e860 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
2e870 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
2e880 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
2e890 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
2e8a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2e8b0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2e8c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
2e8d0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2e8e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
2e8f0 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
2e900 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
2e910 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2e920 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
2e930 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e940 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
2e950 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2e960 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2e970 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
2e980 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
2e990 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2e9a0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
2e9b0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
2e9c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
2e9d0 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
2e9e0 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
2e9f0 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
2ea00 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
2ea10 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
2ea20 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
2ea30 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
2ea40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2ea50 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
2ea60 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
2ea70 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
2ea80 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
2ea90 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
2eaa0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
2eab0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
2eac0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2ead0 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
2eae0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2eaf0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
2eb00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2eb10 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
2eb20 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
2eb30 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
2eb40 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
2eb50 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
2eb60 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
2eb70 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
2eb80 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
2eb90 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2eba0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
2ebb0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
2ebc0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
2ebd0 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
2ebe0 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
2ebf0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
2ec00 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2ec10 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
2ec20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ec30 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2ec40 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
2ec50 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
2ec60 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
2ec70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ec80 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2ec90 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
2eca0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2ecb0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2ecc0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2ecd0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2ece0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2ecf0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
2ed00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2ed10 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2ed20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2ed30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ed40 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2ed50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2ed60 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2ed70 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2ed80 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
2ed90 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2eda0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2edb0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
2edc0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2edd0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2ede0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2edf0 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
2ee00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2ee10 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
2ee20 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
2ee30 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2ee40 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
2ee50 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
2ee60 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
2ee70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2ee80 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
2ee90 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
2eea0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2eeb0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
2eec0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
2eed0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
2eee0 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
2eef0 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
2ef00 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
2ef10 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2ef20 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
2ef30 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
2ef40 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
2ef50 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
2ef60 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
2ef70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
2ef80 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
2ef90 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
2efa0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
2efb0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2efc0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
2efd0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c  ** MemPage.aOvfl
2efe0 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
2eff0 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
2f000 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
2f010 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
2f020 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
2f030 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
2f040 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  btreeInitPage().
2f050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
2f060 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
2f070 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
2f080 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
2f090 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
2f0a0 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
2f0b0 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
2f0c0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
2f0d0 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
2f0e0 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
2f0f0 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
2f100 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
2f110 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
2f120 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64  tic void copyNod
2f130 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
2f140 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
2f150 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29   *pTo, int *pRC)
2f160 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2f170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f180 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
2f190 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
2f1a0 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  Bt;.    u8 * con
2f1b0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2f1c0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20  ->aData;.    u8 
2f1d0 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
2f1e0 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e  o->aData;.    in
2f1f0 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72  t const iFromHdr
2f200 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66   = pFrom->hdrOff
2f210 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  set;.    int con
2f220 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
2f230 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
2f240 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  0 : 0);.    int 
2f250 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74  rc;.    int iDat
2f260 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73  a;.  .  .    ass
2f270 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
2f280 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
2f290 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
2f2a0 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73  iToHdr );.    as
2f2b0 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2f2c0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2f2d0 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ])<=pBt->usableS
2f2e0 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
2f2f0 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
2f300 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
2f310 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
2f320 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
2f330 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2f340 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2f350 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
2f360 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2f370 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2f380 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2f390 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
2f3a0 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
2f3b0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
2f3c0 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
2f3d0 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
2f3e0 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
2f3f0 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2f400 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2f410 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2f420 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2f430 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
2f440 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
2f450 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
2f460 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
2f470 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
2f480 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
2f490 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
2f4a0 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
2f4b0 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
2f4c0 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
2f4d0 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
2f4e0 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
2f4f0 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2f500 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
2f510 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
2f520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f530 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
2f540 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
2f550 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
2f560 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2f570 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2f580 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2f590 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2f5a0 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
2f5b0 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
2f5c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
2f5d0 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
2f5e0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2f5f0 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
2f600 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2f610 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
2f620 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2f630 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
2f640 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2f650 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2f660 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2f670 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2f680 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2f690 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2f6a0 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2f6b0 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2f6c0 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2f6d0 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2f6e0 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2f6f0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2f700 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2f710 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2f720 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2f730 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2f740 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2f750 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2f760 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2f770 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2f780 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2f790 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2f7a0 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2f7b0 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2f7c0 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2f7d0 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2f7e0 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2f7f0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2f800 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2f810 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2f820 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2f830 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2f840 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2f850 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
2f860 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2f870 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2f880 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2f890 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
2f8a0 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2f8b0 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2f8c0 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
2f8d0 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
2f8e0 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
2f8f0 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
2f900 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
2f910 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2f920 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2f930 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2f940 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
2f950 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
2f960 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
2f970 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
2f980 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
2f990 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
2f9a0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
2f9b0 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
2f9c0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2f9d0 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
2f9e0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
2f9f0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2fa00 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
2fa10 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
2fa20 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
2fa30 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
2fa40 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2fa50 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
2fa60 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
2fa70 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
2fa80 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
2fa90 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2faa0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
2fab0 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
2fac0 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
2fad0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
2fae0 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
2faf0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
2fb00 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
2fb10 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
2fb20 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2fb30 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
2fb40 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
2fb50 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
2fb60 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
2fb70 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
2fb80 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
2fb90 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
2fba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2fbb0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2fbc0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2fbd0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2fbe0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2fbf0 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2fc00 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2fc10 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2fc20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2fc30 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2fc40 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
2fc50 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2fc60 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
2fc70 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2fc80 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
2fc90 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
2fca0 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
2fcb0 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
2fcc0 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2fcd0 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
2fce0 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
2fcf0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
2fd00 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
2fd10 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
2fd20 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
2fd30 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
2fd40 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
2fd50 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
2fd60 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
2fd70 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
2fd80 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
2fd90 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
2fda0 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
2fdb0 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
2fdc0 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
2fdd0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
2fde0 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
2fdf0 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
2fe00 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
2fe10 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
2fe20 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2fe30 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
2fe40 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
2fe50 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
2fe60 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
2fe70 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
2fe80 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
2fe90 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2fea0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2feb0 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
2fec0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2fed0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2fee0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
2fef0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
2ff00 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
2ff10 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2ff20 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
2ff30 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2ff40 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
2ff50 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
2ff60 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
2ff70 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
2ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
2ff90 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
2ffa0 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
2ffb0 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
2ffc0 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  sRoot           
2ffd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ffe0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
2fff0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
30000 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
30010 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
30020 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
30030 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
30040 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30060 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
30070 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
30080 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
30090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
300a0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
300b0 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
300c0 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
300d0 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
300e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
300f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
30100 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
30110 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
30120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30130 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
30140 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
30150 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
30160 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30170 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
30180 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
30190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
301a0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
301b0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
301c0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
301d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
301e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
301f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
30200 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
30210 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
30220 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
30230 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
30240 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
30250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30260 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
30270 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
30280 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
30290 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
302a0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
302b0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
302c0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
302d0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
302e0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
302f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
30300 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
30310 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
30320 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
30330 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
30340 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
30350 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
30360 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
30370 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30380 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
30390 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
303a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
303b0 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
303c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
303d0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
303e0 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
303f0 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
30400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30410 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
30420 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
30430 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
30440 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
30450 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
30460 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
30470 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
30480 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
30490 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
304a0 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
304b0 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
304c0 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
304d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
304e0 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
304f0 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
30500 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
30510 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
30520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
30530 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
30540 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
30550 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
30560 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
30570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
30580 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
30590 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
305a0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
305b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
305c0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
305d0 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
305e0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
305f0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
30600 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
30610 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
30620 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
30630 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
30640 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
30650 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
30660 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
30670 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
30680 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30690 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
306a0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
306b0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
306c0 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
306e0 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
306f0 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
30700 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
30710 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
30720 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
30730 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
30740 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
30750 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
30760 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
30770 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30780 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
30790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
307a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
307b0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
307c0 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
307d0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
307e0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
307f0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
30800 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
30810 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
30820 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
30830 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
30840 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
30850 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
30860 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
30870 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
30880 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
30890 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
308a0 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
308b0 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
308c0 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
308d0 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
308e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
308f0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
30900 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
30910 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
30920 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
30930 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
30940 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
30950 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
30960 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
30970 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
30980 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
30990 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
309a0 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
309b0 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
309c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
309d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
309e0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
309f0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
30a00 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
30a10 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
30a20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
30a30 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
30a40 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
30a50 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
30a60 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
30a70 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
30a80 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
30a90 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
30aa0 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
30ab0 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
30ac0 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
30ad0 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
30ae0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
30af0 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
30b00 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
30b10 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
30b20 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
30b30 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
30b40 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
30b50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
30b60 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
30b70 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
30b80 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
30b90 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
30ba0 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
30bb0 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
30bc0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
30bd0 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
30be0 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
30bf0 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
30c00 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
30c10 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
30c20 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
30c30 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
30c40 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
30c50 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
30c60 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
30c70 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
30c80 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
30c90 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
30ca0 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
30cb0 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
30cc0 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
30cd0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
30ce0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
30cf0 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
30d00 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
30d10 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
30d20 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
30d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
30d40 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
30d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
30d60 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
30d70 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
30d80 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
30d90 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
30da0 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
30db0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
30dc0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
30dd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
30de0 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
30df0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
30e00 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
30e10 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
30e20 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
30e30 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
30e40 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
30e50 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
30e60 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
30e70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
30e80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
30e90 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
30ea0 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
30eb0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
30ec0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
30ed0 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  }.    nMaxCells 
30ee0 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
30ef0 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
30f00 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
30f10 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (i--)==0 ) bre
30f20 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e  ak;..    if( i+n
30f30 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
30f40 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70  Ovfl[0].idx && p
30f50 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
30f60 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
30f70 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
30f80 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
30f90 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
30fa0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
30fb0 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
30fc0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
30fd0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
30fe0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
30ff0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
31000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31010 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
31020 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
31030 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
31040 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
31050 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31060 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
31070 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
31080 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
31090 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
310a0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
310b0 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
310c0 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
310d0 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
310e0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
310f0 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
31100 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
31110 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
31120 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
31130 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
31140 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
31150 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
31160 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
31170 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
31180 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
31190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
311a0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
311b0 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
311c0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
311d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
311e0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
311f0 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
31200 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
31210 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
31220 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74   ** Unless SQLit
31230 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  e is compiled in
31240 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
31250 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
31260 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
31270 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
31280 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
31290 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
312a0 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
312b0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
312c0 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
312d0 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
312e0 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
312f0 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
31300 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
31310 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
31320 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
31330 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
31340 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
31350 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
31360 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75     if( pBt->secu
31370 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
31380 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 53      int iOff = S
31390 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
313a0 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
313b0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
313c0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
313d0 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
313e0 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
313f0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31410 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31420 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
31430 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
31440 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
31450 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
31460 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
31470 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31490 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
314a0 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
314b0 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
314c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
314d0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
314e0 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
314f0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
31500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31510 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
31520 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
31530 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
31540 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
31550 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
31560 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
31570 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
31580 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
31590 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
315a0 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
315b0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
315c0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
315d0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
315e0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
315f0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
31600 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
31610 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
31620 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
31630 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
31640 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
31650 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
31660 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
31670 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
31680 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
31690 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
316a0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
316b0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
316c0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
316d0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316f0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
31700 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
31710 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31740 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
31750 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
31760 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
31770 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
31780 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
31790 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
317a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
317b0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
317c0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
317d0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
317e0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
317f0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
31800 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
31810 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
31820 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
31830 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
31840 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
31850 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
31860 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
31870 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
31880 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
31890 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
318a0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
318b0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
318c0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
318d0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
318e0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
318f0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
31900 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
31910 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
31920 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
31930 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
31940 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
31950 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
31960 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
31970 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
31980 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
31990 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
319a0 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
319b0 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
319c0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
319d0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
319e0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
319f0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
31a00 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
31a10 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
31a20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
31a30 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
31a40 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
31a50 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
31a60 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
31a70 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
31a80 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
31a90 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
31aa0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
31ab0 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
31ac0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
31ad0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
31ae0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
31af0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
31b00 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
31b10 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
31b20 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
31b30 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
31b40 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
31b50 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
31b60 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
31b70 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
31b80 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
31b90 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
31ba0 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
31bb0 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
31bc0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
31bd0 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
31be0 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
31bf0 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
31c00 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
31c10 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
31c20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
31c30 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
31c40 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
31c50 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
31c60 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
31c70 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
31c80 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
31c90 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
31ca0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
31cb0 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
31cc0 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
31cd0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
31ce0 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
31cf0 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
31d00 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
31d10 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
31d20 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
31d30 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
31d40 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
31d50 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
31d60 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
31d70 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
31d80 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
31d90 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
31da0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
31db0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
31dc0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
31dd0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
31de0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
31df0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
31e00 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
31e10 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
31e20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
31e30 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
31e40 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
31e50 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65  ell]);.      nCe
31e60 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
31e70 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20  if( i<nOld-1 && 
31e80 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20  !leafData){.    
31e90 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29    u16 sz = (u16)
31ea0 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  szNew[i];.      
31eb0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
31ec0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
31ed0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31ee0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
31ef0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d  = sz;.      pTem
31f00 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
31f10 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70  ace1];.      iSp
31f20 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
31f30 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
31f40 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29  t->maxLocal+23 )
31f50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31f60 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61  iSpace1<=pBt->pa
31f70 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
31f80 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
31f90 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
31fa0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
31fb0 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
31fc0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61  rection;.      a
31fd0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
31fe0 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
31ff0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
32000 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
32010 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43  ell] = szCell[nC
32020 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65  ell] - leafCorre
32030 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
32040 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
32050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32060 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
32070 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
32080 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66  ert( pOld->hdrOf
32090 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  fset==0 );.     
320a0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
320b0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
320c0 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
320d0 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
320e0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
320f0 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
32100 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
32110 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
32120 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
32130 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20  Data[8], 4);.   
32140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32150 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
32160 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
32170 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
32180 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
32190 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
321a0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
321b0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
321c0 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
321d0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
321e0 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l] = 4;.        
321f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
32200 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
32210 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
32220 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
32230 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
32240 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
32250 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
32260 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
32270 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
32280 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
32290 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
322a0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
322b0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
322c0 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
322d0 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
322e0 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
322f0 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
32300 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
32310 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
32320 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
32330 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
32340 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
32350 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
32360 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
32370 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
32380 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
32390 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
323a0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
323b0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
323c0 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
323d0 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
323e0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
323f0 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
32400 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
32410 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
32420 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
32430 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
32440 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
32450 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
32460 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
32470 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
32480 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
32490 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
324a0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
324b0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
324c0 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
324d0 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
324e0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
324f0 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
32500 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
32510 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
32520 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
32530 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
32540 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
32550 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
32560 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
32570 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
32580 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
32590 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
325a0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
325b0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
325c0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
325d0 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
325e0 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20       k++;.      
325f0 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63  if( k>NB+1 ){ rc
32600 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32610 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c  T_BKPT; goto bal
32620 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a  ance_cleanup; }.
32630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
32640 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
32650 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
32660 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
32670 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
32680 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
32690 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
326a0 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
326b0 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
326c0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
326d0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
326e0 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
326f0 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
32700 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
32710 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
32720 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
32730 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
32740 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
32750 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
32760 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
32770 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
32780 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
32790 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
327a0 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
327b0 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
327c0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
327d0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
327e0 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
327f0 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
32800 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
32810 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
32820 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
32830 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
32840 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
32850 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
32860 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
32870 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
32880 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
32890 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
328a0 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
328b0 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
328c0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
328d0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
328e0 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
328f0 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
32900 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
32910 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
32920 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
32930 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
32940 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
32950 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
32960 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
32970 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
32980 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
32990 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
329a0 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
329b0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
329c0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
329d0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
329e0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
329f0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32a00 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
32a10 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
32a20 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
32a30 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
32a40 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
32a50 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
32a60 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
32a70 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
32a80 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
32a90 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
32aa0 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
32ab0 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
32ac0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
32ad0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
32ae0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
32af0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
32b00 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
32b10 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
32b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
32b30 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
32b40 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
32b50 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70  tnew[0])>0) or p
32b60 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76  Page is.  ** a v
32b70 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
32b80 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
32b90 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
32ba0 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
32bb0 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
32bc0 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
32bd0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
32be0 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
32bf0 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
32c00 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
32c10 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
32c20 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
32c30 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
32c40 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
32c50 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c   %d  ",.    apOl
32c60 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20  d[0]->pgno, .   
32c70 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64   nOld>=2 ? apOld
32c80 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20  [1]->pgno : 0,. 
32c90 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f     nOld>=3 ? apO
32ca0 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a  ld[2]->pgno : 0.
32cb0 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a    ));..  /*.  **
32cc0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
32cd0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
32ce0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
32cf0 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  ssible..  */.  i
32d00 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e  f( apOld[0]->pgn
32d10 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  o<=1 ){.    rc =
32d20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32d30 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62  BKPT;.    goto b
32d40 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
32d50 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20    }.  pageFlags 
32d60 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74  = apOld[0]->aDat
32d70 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
32d80 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
32d90 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
32da0 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
32db0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
32dc0 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
32dd0 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
32de0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
32df0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32e00 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
32e10 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
32e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
32e30 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32e40 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
32e50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32e60 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
32e70 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
32e80 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
32e90 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b  &pgno, pgno, 0);
32ea0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
32eb0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
32ec0 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
32ed0 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
32ee0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
32ef0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
32f00 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
32f10 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
32f20 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
32f30 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
32f40 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
32f50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
32f60 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
32f70 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
32f80 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
32f90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32fa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32fb0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
32fc0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
32fd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
32fe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
32ff0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
33000 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
33010 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
33020 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
33030 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65  <nOld ){.    fre
33040 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20  ePage(apOld[i], 
33050 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
33060 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
33070 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
33080 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
33090 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
330a0 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
330b0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
330c0 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
330d0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
330e0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
330f0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
33100 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
33110 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
33120 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
33130 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
33140 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
33150 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
33160 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
33170 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
33180 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
33190 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
331a0 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
331b0 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
331c0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
331d0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
331e0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
331f0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
33200 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
33210 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
33220 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
33230 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
33240 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
33250 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
33260 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
33270 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
33280 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
33290 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
332a0 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
332b0 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
332c0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
332d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
332e0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
332f0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
33300 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
33310 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
33320 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
33330 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
33340 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
33350 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
33360 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
33370 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
33380 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
33390 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
333a0 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
333b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
333c0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
333d0 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70  pT;.      t = ap
333e0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
333f0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
33400 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
33410 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
33420 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
33430 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
33440 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
33450 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
33460 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
33470 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
33480 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
33490 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
334a0 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
334b0 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
334c0 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
334d0 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
334e0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
334f0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
33500 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
33510 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
33520 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
33530 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
33540 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
33550 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
33560 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
33570 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
33580 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33590 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
335a0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
335b0 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
335c0 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
335d0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
335e0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
335f0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
33600 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
33610 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
33620 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
33630 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
33640 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
33650 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
33660 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
33670 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
33680 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
33690 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
336a0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
336b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
336c0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
336d0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
336e0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
336f0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
33700 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
33710 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
33720 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
33730 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
33740 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
33750 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
33760 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
33770 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
33780 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
33790 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
337a0 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
337b0 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
337c0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
337d0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
337e0 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
337f0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
33800 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
33810 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
33820 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
33830 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
33840 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
33850 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
33860 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
33870 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
33880 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
33890 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
338a0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
338b0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
338c0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
338d0 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
338e0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
338f0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
33900 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
33910 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
33920 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
33930 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
33940 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
33950 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
33960 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
33970 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
33980 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
33990 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
339a0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
339b0 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
339c0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
339d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
339e0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
339f0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
33a00 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
33a10 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
33a20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
33a30 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
33a40 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
33a50 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
33a60 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
33a70 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
33a80 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
33a90 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
33aa0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
33ab0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
33ac0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
33ad0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
33ae0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
33af0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
33b00 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
33b10 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
33b20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
33b30 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
33b40 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
33b50 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
33b60 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
33b70 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
33b80 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
33b90 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
33ba0 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
33bb0 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
33bc0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
33bd0 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
33be0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
33bf0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
33c00 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
33c10 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
33c20 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
33c30 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
33c40 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
33c50 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
33c60 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
33c70 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
33c80 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
33c90 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
33ca0 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
33cb0 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
33cc0 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
33cd0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
33ce0 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
33cf0 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
33d00 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
33d10 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
33d20 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
33d30 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
33d40 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
33d50 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
33d60 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
33d70 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
33d80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
33d90 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
33da0 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
33db0 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
33dc0 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
33dd0 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
33de0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
33df0 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
33e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
33e10 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
33e20 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
33e30 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
33e40 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
33e50 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
33e60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
33e70 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
33e80 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
33e90 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
33ea0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
33eb0 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42  ( iOvflSpace<=pB
33ec0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
33ed0 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28       insertCell(
33ee0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
33ef0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
33f00 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
33f10 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
33f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
33f30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
33f40 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
33f50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33f60 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
33f70 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
33f80 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
33f90 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
33fa0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
33fb0 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
33fc0 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
33fd0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
33fe0 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
33ff0 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
34000 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
34010 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
34020 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
34030 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
34040 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
34050 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
34060 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
34070 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  oot && pParent->
34080 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
34090 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d  ent->hdrOffset<=
340a0 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
340b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ){.    /* The ro
340c0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
340d0 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -tree now contai
340e0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65  ns no cells. The
340f0 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20   only sibling.  
34100 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65    ** page is the
34110 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
34120 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79  the parent. Copy
34130 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
34140 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
34150 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  d page into the 
34160 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69  parent, decreasi
34170 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68  ng the overall h
34180 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20  eight of the.   
34190 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63   ** b-tree struc
341a0 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69  ture by one. Thi
341b0 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61  s is described a
341c0 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73  s the "balance-s
341d0 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a  hallower".    **
341e0 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69   sub-algorithm i
341f0 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61  n some documenta
34200 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tion..    **.   
34210 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
34220 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
34230 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c  tabase, the call
34240 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74   to copyNodeCont
34250 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65  ent() .    ** se
34260 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  ts all pointer-m
34270 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
34280 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61  sponding to data
34290 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73  base image pages
342a0 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69   .    ** for whi
342b0 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ch the pointer i
342c0 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  s stored within 
342d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  the content bein
342e0 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a  g copied..    **
342f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
34300 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20  nd assert below 
34310 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
34320 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  e child page is 
34330 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20  defragmented.   
34340 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c   ** (it must be,
34350 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20   as it was just 
34360 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73  reconstructed us
34370 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ing assemblePage
34380 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  ()). This.    **
34390 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66   is important if
343a0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
343b0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70   happens to be p
343c0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
343d0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61  abase.    ** ima
343e0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ge.  */.    asse
343f0 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20  rt( nNew==1 );. 
34400 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77     assert( apNew
34410 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20  [0]->nFree == . 
34420 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65         (get2byte
34430 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74  (&apNew[0]->aDat
34440 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e  a[5])-apNew[0]->
34450 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77  cellOffset-apNew
34460 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20  [0]->nCell*2) . 
34470 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f     );.    copyNo
34480 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b  deContent(apNew[
34490 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63  0], pParent, &rc
344a0 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  );.    freePage(
344b0 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a  apNew[0], &rc);.
344c0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
344d0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
344e0 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
344f0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
34500 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
34510 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
34520 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
34530 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
34540 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
34550 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
34560 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
34570 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
34580 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
34590 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
345a0 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
345b0 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
345c0 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
345d0 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
345e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
345f0 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
34600 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
34610 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
34620 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
34630 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
34640 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
34650 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
34660 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
34670 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
34680 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
34690 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
346a0 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
346b0 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
346c0 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
346d0 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
346e0 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
346f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
34700 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
34710 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
34720 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
34730 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
34740 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
34750 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
34760 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
34770 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
34780 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
34790 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
347a0 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
347b0 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
347c0 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
347d0 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
347e0 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
347f0 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
34800 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
34810 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
34820 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
34830 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
34840 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
34850 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
34860 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
34870 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
34880 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
34890 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
348a0 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
348b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
348c0 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
348d0 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
348e0 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
348f0 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
34900 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
34910 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
34920 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
34930 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
34940 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
34950 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
34960 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
34970 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
34980 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
34990 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
349a0 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
349b0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
349c0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
349d0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
349e0 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
349f0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
34a00 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
34a10 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
34a20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
34a30 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
34a40 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
34a50 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
34a60 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
34a70 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
34a80 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
34a90 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
34aa0 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
34ab0 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
34ac0 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
34ad0 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
34ae0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
34af0 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
34b00 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
34b10 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
34b20 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
34b30 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
34b40 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
34b50 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
34b60 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
34b70 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
34b80 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
34b90 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
34ba0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
34bb0 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
34bc0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
34bd0 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
34be0 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
34bf0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
34c00 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
34c10 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
34c20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
34c30 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
34c40 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
34c50 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
34c60 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
34c70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
34c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34c90 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
34ca0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
34cb0 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cd0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
34ce0 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
34cf0 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
34d00 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
34d10 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
34d20 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
34d30 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
34d40 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
34d50 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
34d60 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
34d70 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
34d80 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
34d90 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
34da0 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
34db0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
34dc0 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
34dd0 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
34de0 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
34df0 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
34e00 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
34e10 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20  */.        pOld 
34e20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20  = apCopy[++j];. 
34e30 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20         iNextOld 
34e40 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
34e50 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  + pOld->nCell + 
34e60 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
34e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c  .        if( pOl
34e80 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
34e90 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66            nOverf
34ea0 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
34eb0 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  rflow;.         
34ec0 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b   iOverflow = i +
34ed0 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
34ee0 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b  d->aOvfl[0].idx;
34ef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34f00 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
34f10 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
34f20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
34f30 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
34f40 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
34f50 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
34f60 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
34f70 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
34f80 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
34f90 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  dx-1);.      ass
34fa0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
34fb0 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  || pOld->aOvfl[1
34fc0 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
34fd0 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[2].idx-1);.  
34fe0 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72      if( i==iOver
34ff0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
35000 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20  isDivider = 1;. 
35010 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f         if( (--nO
35020 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20  verflow)>0 ){.  
35030 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
35040 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w++;.        }. 
35050 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
35060 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29  ( i==cntNew[k] )
35070 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
35080 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
35090 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
350a0 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
350b0 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20  ell on new.     
350c0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
350d0 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62  ge k. If the sib
350e0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
350f0 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
35100 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
35110 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
35120 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65  ll i is a divide
35130 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  r cell.  */.    
35140 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
35150 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++k];.        i
35160 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63  f( !leafData ) c
35170 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
35180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
35190 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61  <nOld );.      a
351a0 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b  ssert( k<nNew );
351b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
351c0 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69  e cell was origi
351d0 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65  nally divider ce
351e0 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e  ll (and is not n
351f0 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ow) or.      ** 
35200 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
35210 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c  , or if the cell
35220 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20   was located on 
35230 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c  a different sibl
35240 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ing.      ** pag
35250 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c  e before the bal
35260 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  ancing, then the
35270 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
35280 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ries associated.
35290 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
352a0 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  y child or overf
352b0 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74  low pages need t
352c0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a  o be updated.  *
352d0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
352e0 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70  vider || pOld->p
352f0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
35300 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
35310 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
35320 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d  {.          ptrm
35330 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
35340 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20  yte(apCell[i]), 
35350 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
35360 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
35370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35380 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e    if( szCell[i]>
35390 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
353a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d  {.          ptrm
353b0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
353c0 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72  w, apCell[i], &r
353d0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
353e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
353f0 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
35400 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  tion ){.      fo
35410 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
35420 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  ++){.        u32
35430 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65 28   key = get4byte(
35440 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61  &apNew[i]->aData
35450 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  [8]);.        pt
35460 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79  rmapPut(pBt, key
35470 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
35480 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20  apNew[i]->pgno, 
35490 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
354a0 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f    }..#if 0.    /
354b0 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63  * The ptrmapChec
354c0 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e  kPages() contain
354d0 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  s assert() state
354e0 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66  ments that verif
354f0 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c  y that.    ** al
35500 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  l pointer map pa
35510 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72  ges are set corr
35520 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68  ectly. This is h
35530 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20  elpful while .  
35540 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20    ** debugging. 
35550 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
35560 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65  disabled because
35570 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
35580 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63  ase may.    ** c
35590 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29  ause an assert()
355a0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61   statement to fa
355b0 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d  il.  */.    ptrm
355c0 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e  apCheckPages(apN
355d0 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70  ew, nNew);.    p
355e0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
355f0 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65  &pParent, 1);.#e
35600 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ndif.  }..  asse
35610 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
35620 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28  nit );.  TRACE((
35630 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
35640 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  ed: old=%d new=%
35650 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
35660 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e           nOld, n
35670 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20  New, nCell));.. 
35680 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
35690 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
356a0 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
356b0 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
356c0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
356d0 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
356e0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
356f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35700 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
35710 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
35720 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
35730 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
35740 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
35750 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
35760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35770 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
35780 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
35790 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
357a0 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28  is.** overfull (
357b0 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
357c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
357d0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69  .**.** A new chi
357e0 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ld page is alloc
357f0 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e  ated and the con
35800 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72  tents of the cur
35810 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  rent root.** pag
35820 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65  e, including ove
35830 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65  rflow cells, are
35840 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
35850 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74   child. The root
35860 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e  .** page is then
35870 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20   overwritten to 
35880 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79  make it an empty
35890 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72   page with the r
358a0 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70  ight-child .** p
358b0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
358c0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
358d0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
358e0 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69  turning, all poi
358f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
35900 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
35910 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74  o pages .** that
35920 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70   the new child-p
35930 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  age now contains
35940 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65   pointers to are
35950 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a   updated. The.**
35960 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e   entry correspon
35970 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ding to the new 
35980 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
35990 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a  ter of the root.
359a0 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  ** page is also 
359b0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  updated..**.** I
359c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
359d0 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
359e0 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72   contain a refer
359f0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c  ence to the chil
35a00 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53  d .** page and S
35a10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
35a20 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
35a30 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  se the caller is
35a40 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
35a50 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
35a60 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65  () on *ppChild e
35a70 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20  xactly once. If 
35a80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
35a90 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
35aa0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
35ab0 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  d *ppChild is se
35ac0 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
35ad0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
35ae0 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52  eper(MemPage *pR
35af0 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70  oot, MemPage **p
35b00 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72  pChild){.  int r
35b10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
35b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35b30 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
35b40 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
35b50 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
35b60 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
35b70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
35b80 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
35b90 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
35ba0 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
35bb0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
35bc0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
35bd0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
35be0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52  Shared *pBt = pR
35bf0 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  oot->pBt;    /* 
35c00 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20  The BTree */..  
35c10 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e  assert( pRoot->n
35c20 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
35c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35c40 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
35c50 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
35c60 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20  Make pRoot, the 
35c70 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
35c80 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c   b-tree, writabl
35c90 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  e. Allocate a ne
35ca0 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61  w .  ** page tha
35cb0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
35cc0 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
35cd0 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79  d of pPage. Copy
35ce0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
35cf0 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73  ** of the node s
35d00 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69  tored on pRoot i
35d10 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c  nto the new chil
35d20 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72  d page..  */.  r
35d30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35d40 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
35d50 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
35d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35d70 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
35d80 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43  treePage(pBt,&pC
35d90 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c  hild,&pgnoChild,
35da0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a  pRoot->pgno,0);.
35db0 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
35dc0 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  ent(pRoot, pChil
35dd0 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  d, &rc);.    if(
35de0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
35df0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
35e00 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  (pBt, pgnoChild,
35e10 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
35e20 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Root->pgno, &rc)
35e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
35e40 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43  ( rc ){.    *ppC
35e50 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  hild = 0;.    re
35e60 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
35e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
35e80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
35e90 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35ea0 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
35eb0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
35ec0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
35ed0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52  erIswriteable(pR
35ee0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  oot->pDbPage) );
35ef0 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
35f00 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d  d->nCell==pRoot-
35f10 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41  >nCell );..  TRA
35f20 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
35f30 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
35f40 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67  %d\n", pRoot->pg
35f50 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
35f60 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74  ));..  /* Copy t
35f70 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
35f80 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20  s from pRoot to 
35f90 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63  pChild */.  memc
35fa0 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
35fb0 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20  , pRoot->aOvfl, 
35fc0 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
35fd0 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61  *sizeof(pRoot->a
35fe0 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
35ff0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
36000 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
36010 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  w;..  /* Zero th
36020 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52  e contents of pR
36030 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c  oot. Then instal
36040 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20  l pChild as the 
36050 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a  right-child. */.
36060 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
36070 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
36080 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b  0] & ~PTF_LEAF);
36090 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f  .  put4byte(&pRo
360a0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
360b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
360c0 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70  gnoChild);..  *p
360d0 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b  pChild = pChild;
360e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
360f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
36100 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72  e page that pCur
36110 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
36120 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65  s to has just be
36130 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a  en modified in.*
36140 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73  * some way. This
36150 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65   function figure
36160 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f  s out if this mo
36170 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73  dification means
36180 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65   the.** tree nee
36190 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
361a0 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c  d, and if so cal
361b0 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ls the appropria
361c0 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a  te balancing .**
361d0 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63   routine. Balanc
361e0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
361f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  :.**.**   balanc
36200 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62  e_quick().**   b
36210 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a  alance_deeper().
36220 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  **   balance_non
36230 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63  root().*/.static
36240 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
36250 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
36260 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36270 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  OK;.  const int 
36280 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74  nMin = pCur->pBt
36290 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32  ->usableSize * 2
362a0 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61   / 3;.  u8 aBala
362b0 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33  nceQuickSpace[13
362c0 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  ];.  u8 *pFree =
362d0 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28   0;..  TESTONLY(
362e0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
362f0 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  ck_called = 0 );
36300 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
36310 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f   balance_deeper_
36320 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20  called = 0 );.. 
36330 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50   do {.    int iP
36340 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
36350 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
36360 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
36370 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20  Page[iPage];..  
36380 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
36390 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
363a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
363b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
363c0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
363d0 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75  b-tree is overfu
363e0 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
363f0 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20   call the.      
36400 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65    ** balance_dee
36410 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  per() function t
36420 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63  o create a new c
36430 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  hild for the roo
36440 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
36450 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63  * and copy the c
36460 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
36470 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
36480 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20   to it. The.    
36490 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72      ** next iter
364a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
364b0 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
364c0 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  e the child page
364d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20  ..        */ .  
364e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
364f0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
36500 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
36510 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
36520 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c  ce_deeper(pPage,
36530 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31   &pCur->apPage[1
36540 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
36550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36560 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
36570 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  >iPage = 1;.    
36580 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
36590 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[0] = 0;.      
365a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
365b0 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
365c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
365d0 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72  apPage[1]->nOver
365e0 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20  flow );.        
365f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
36600 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36610 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
36620 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
36630 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
36640 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b  ->nFree<=nMin ){
36650 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
36660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
36670 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70  emPage * const p
36680 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
36690 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a  pPage[iPage-1];.
366a0 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20        int const 
366b0 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  iIdx = pCur->aiI
366c0 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20  dx[iPage-1];..  
366d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
366e0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
366f0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
36700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36710 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66  TE_OK ){.#ifndef
36720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
36730 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20  CKBALANCE.      
36740 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
36750 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26 26  Data.         &&
36760 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
36770 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  w==1.         &&
36780 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
36790 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  .idx==pPage->nCe
367a0 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ll.         && p
367b0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a  Parent->pgno!=1.
367c0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
367d0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78  ent->nCell==iIdx
367e0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
367f0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61        /* Call ba
36800 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f  lance_quick() to
36810 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73 69   create a new si
36820 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f  bling of pPage o
36830 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
36840 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68    ** to store th
36850 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
36860 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
36870 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63   inserts a new c
36880 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ell.          **
36890 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77   into pParent, w
368a0 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70  hich may cause p
368b0 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e  Parent overflow.
368c0 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   If this.       
368d0 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
368e0 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69  he next interati
368f0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
36900 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70  p will balance p
36910 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  Parent .        
36920 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20    ** use either 
36930 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
36940 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65  ) or balance_dee
36950 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69  per(). Until thi
36960 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  s.          ** h
36970 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72  appens, the over
36980 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f  flow cell is sto
36990 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61  red in the aBala
369a0 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a  nceQuickSpace[].
369b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
369c0 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20  fer. .          
369d0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
369e0 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  The purpose of t
369f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
36a00 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65 63  ert() is to chec
36a10 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20  k that only a.  
36a20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
36a30 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  e call to balanc
36a40 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64  e_quick() is mad
36a50 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  e for each call 
36a60 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  to this.        
36a70 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49    ** function. I
36a80 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20  f this were not 
36a90 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62 74  verified, a subt
36aa0 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67  le bug involving
36ab0 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20 20   reuse.         
36ac0 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61   ** of the aBala
36ad0 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20  nceQuickSpace[] 
36ae0 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a  might sneak in..
36af0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
36b00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
36b10 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61  balance_quick_ca
36b20 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
36b30 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
36b40 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65  ance_quick(pPare
36b50 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61  nt, pPage, aBala
36b60 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a  nceQuickSpace);.
36b70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
36b80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
36b90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
36ba0 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62  his case, call b
36bb0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
36bc0 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65   to redistribute
36bd0 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
36be0 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67   ** between pPag
36bf0 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66  e and up to 2 of
36c00 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67   its sibling pag
36c10 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  es. This involve
36c20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d  s.          ** m
36c30 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
36c40 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74  tents of pParent
36c50 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
36c60 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20  e pParent to.   
36c70 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65         ** become
36c80 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
36c90 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74  erfull. The next
36ca0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
36cb0 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20  e do-loop.      
36cc0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61      ** will bala
36cd0 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
36ce0 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74  age to correct t
36cf0 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  his..          *
36d00 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  * .          ** 
36d10 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  If the parent pa
36d20 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
36d30 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f  ull, the overflo
36d40 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a  w cell or cells.
36d50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65            ** are
36d60 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
36d70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c  Space buffer all
36d80 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65  ocated immediate
36d90 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20  ly below. .     
36da0 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71       ** A subseq
36db0 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  uent iteration o
36dc0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
36dd0 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68 69  ll deal with thi
36de0 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  s by.          *
36df0 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63  * calling balanc
36e00 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c  e_nonroot() (bal
36e10 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61  ance_deeper() ma
36e20 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  y be called firs
36e30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t,.          ** 
36e40 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64  but it doesn't d
36e50 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  eal with overflo
36e60 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d  w cells - just m
36e70 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20  oves them to a. 
36e80 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66           ** diff
36e90 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63  erent page). Onc
36ea0 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65 6e  e this subsequen
36eb0 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  t call to balanc
36ec0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20  e_nonroot() .   
36ed0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f         ** has co
36ee0 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73  mpleted, it is s
36ef0 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74  afe to release t
36f00 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36f10 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20 20   used by.       
36f20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f     ** the previo
36f30 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20  us call, as the 
36f40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61  overflow cell da
36f50 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ta will have bee
36f60 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n .          ** 
36f70 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69 6e  copied either in
36f80 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  to the body of a
36f90 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6f   database page o
36fa0 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  r into the new. 
36fb0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61           ** pSpa
36fc0 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ce buffer passed
36fd0 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63   to the latter c
36fe0 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
36ff0 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20  onroot()..      
37000 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
37010 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71   u8 *pSpace = sq
37020 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
37030 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
37040 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
37050 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
37060 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49  root(pParent, iI
37070 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67  dx, pSpace, iPag
37080 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e==1);.         
37090 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
370a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
370b0 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pFree is not NUL
370c0 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  L, it points to 
370d0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
370e0 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  r used .        
370f0 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76      ** by a prev
37100 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ious call to bal
37110 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20  ance_nonroot(). 
37120 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  Its contents are
37130 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
37140 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68 65  now stored eithe
37150 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61  r on real databa
37160 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74 68  se pages or with
37170 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
37180 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63      ** new pSpac
37190 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20  e buffer, so it 
371a0 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66 72  may be safely fr
371b0 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  eed here. */.   
371c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
371d0 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
371e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
371f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
37200 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69 6c  Space buffer wil
37210 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65 72  l be freed after
37220 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
37230 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
37240 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
37250 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65  , or just before
37260 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
37270 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65  eturns, whicheve
37280 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
37290 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20  omes first. */. 
372a0 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d           pFree =
372b0 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20   pSpace;.       
372c0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
372d0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
372e0 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ow = 0;..      /
372f0 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  * The next itera
37300 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
37310 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65  oop balances the
37320 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f   parent page. */
37330 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
37340 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
37350 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
37360 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
37370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
37380 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ..  if( pFree ){
37390 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
373a0 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d  Free(pFree);.  }
373b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
373c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
373d0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
373e0 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
373f0 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
37400 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
37410 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
37420 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
37430 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
37440 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
37450 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
37460 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
37470 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
37480 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
37490 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
374a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
374b0 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
374c0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
374d0 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
374e0 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
374f0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
37500 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
37510 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
37520 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
37530 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
37540 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
37550 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
37560 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
37570 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
37580 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75  -zero, then a su
37590 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f  ccessful call to
375a0 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  .** MovetoUnpack
375b0 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72  ed() to seek cur
375c0 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65  sor pCur to (pKe
375d0 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72  y, nKey) has alr
375e0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72  eady.** been per
375f0 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75  formed. seekResu
37600 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68  lt is the search
37610 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64   result returned
37620 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20   (a negative.** 
37630 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70  number if pCur p
37640 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72  oints at an entr
37650 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65  y that is smalle
37660 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b  r than (pKey, nK
37670 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73  ey), or.** a pos
37680 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70  itive value if p
37690 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
376a0 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61   etry that is la
376b0 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70  rger than .** (p
376c0 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a  Key, nKey)). .**
376d0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
376e0 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
376f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
37700 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 67 75 61  n the caller gua
37710 72 61 6e 74 65 65 73 20 74 68 61 74 0a 2a 2a 20  rantees that.** 
37720 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
37730 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 65  ointing at the e
37740 78 69 73 74 69 6e 67 20 63 6f 70 79 20 6f 66 20  xisting copy of 
37750 61 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f  a row that is to
37760 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74   be.** overwritt
37770 65 6e 2e 20 20 49 66 20 74 68 65 20 73 65 65 6b  en.  If the seek
37780 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
37790 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73   is 0, then curs
377a0 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a 20 70  or pCur may.** p
377b0 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e 74 72  oint to any entr
377c0 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79  y or to no entry
377d0 20 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f 20 74   at all and so t
377e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
377f0 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20   to seek.** the 
37800 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68  cursor before th
37810 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65  e new key can be
37820 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
37830 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
37840 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72  sert(.  BtCursor
37850 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
37860 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
37870 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74   data into the t
37880 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72  able of this cur
37890 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  sor */.  const v
378a0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
378b0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
378c0 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ey of the new re
378d0 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
378e0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
378f0 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20   nData,  /* The 
37900 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20  data of the new 
37910 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
37920 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
37930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
37940 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20  mber of extra 0 
37950 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
37960 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  to data */.  int
37970 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20   appendBias,    
37980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
37990 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c  rue if this is l
379a0 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20  ikely an append 
379b0 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73  */.  int seekRes
379c0 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
379d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
379e0 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70   prior MovetoUnp
379f0 61 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a  acked() call */.
37a00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
37a10 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73  nt loc = seekRes
37a20 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ult;          /*
37a30 20 2d 31 3a 20 62 65 66 6f 72 65 20 64 65 73 69   -1: before desi
37a40 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31  red location  +1
37a50 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20 69 6e 74  : after */.  int
37a60 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e   szNew = 0;.  in
37a70 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
37a80 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
37a90 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
37aa0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
37ab0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
37ac0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
37ad0 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
37ae0 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
37af0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75   = 0;..  if( pCu
37b00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
37b10 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61  R_FAULT ){.    a
37b20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
37b30 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
37b40 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   );.    return p
37b50 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
37b60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75   }..  assert( cu
37b70 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
37b80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
37b90 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
37ba0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
37bb0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
37bc0 45 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  E && !pBt->readO
37bd0 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nly );.  assert(
37be0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
37bf0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
37c00 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
37c10 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
37c20 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
37c30 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
37c40 72 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69  r has been consi
37c50 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63  stent. If this c
37c60 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
37c70 0a 20 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20  .  ** expecting 
37c80 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c  an index b-tree,
37c90 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
37ca0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
37cb0 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b  ting blob.  ** k
37cc0 65 79 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f  eys with no asso
37cd0 63 69 61 74 65 64 20 64 61 74 61 2e 20 49 66 20  ciated data. If 
37ce0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  the cursor was o
37cf0 70 65 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20  pened expecting 
37d00 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74  an.  ** intkey t
37d10 61 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72  able, the caller
37d20 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
37d30 74 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79  ting integer key
37d40 73 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c  s with a.  ** bl
37d50 6f 62 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64  ob of associated
37d60 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73   data.  */.  ass
37d70 65 72 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d  ert( (pKey==0)==
37d80 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
37d90 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
37da0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72  this is an inser
37db0 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62  t into a table b
37dc0 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74  -tree, invalidat
37dd0 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a  e any incrblob .
37de0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65    ** cursors ope
37df0 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69  n on the row bei
37e00 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61 73 73  ng replaced (ass
37e10 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61 20  uming this is a 
37e20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65  replace.  ** ope
37e30 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69  ration - if it i
37e40 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f  s not, the follo
37e50 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29  wing is a no-op)
37e60 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  .  */.  if( pCur
37e70 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b  ->pKeyInfo==0 ){
37e80 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49  .    invalidateI
37e90 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70  ncrblobCursors(p
37ea0 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a  , nKey, 0);.  }.
37eb0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
37ec0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
37ed0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
37ee0 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
37ef0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73  ..  **.  ** In s
37f00 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 63  ome cases, the c
37f10 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65  all to btreeMove
37f20 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20  to() below is a 
37f30 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20  no-op. For.  ** 
37f40 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e  example, when in
37f50 73 65 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74  serting data int
37f60 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  o a table with a
37f70 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e  uto-generated in
37f80 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c  teger.  ** keys,
37f90 20 74 68 65 20 56 44 42 45 20 6c 61 79 65 72 20   the VDBE layer 
37fa0 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42  invokes sqlite3B
37fb0 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69  treeLast() to fi
37fc0 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20  gure out the .  
37fd0 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74  ** integer key t
37fe0 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63  o use. It then c
37ff0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
38000 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69  on to actually i
38010 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20  nsert the .  ** 
38020 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e  data into the in
38030 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20  tkey B-Tree. In 
38040 74 68 69 73 20 63 61 73 65 20 62 74 72 65 65 4d  this case btreeM
38050 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a  oveto() recogniz
38060 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  es.  ** that the
38070 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
38080 64 79 20 77 68 65 72 65 20 69 74 20 6e 65 65 64  dy where it need
38090 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75  s to be and retu
380a0 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  rns without.  **
380b0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e   doing any work.
380c0 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74   To avoid thwart
380d0 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69  ing these optimi
380e0 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69  zations, it is i
380f0 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f  mportant.  ** no
38100 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63  t to clear the c
38110 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f  ursor here..  */
38120 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
38130 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
38140 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
38150 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
38160 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21  turn rc;.  if( !
38170 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  loc ){.    rc = 
38180 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
38190 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70  , pKey, nKey, ap
381a0 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b  pendBias, &loc);
381b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
381c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
381d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
381e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
381f0 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61  D || (pCur->eSta
38200 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
38210 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20  ID && loc) );.. 
38220 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
38230 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
38240 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
38250 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e  age->intKey || n
38260 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
38270 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
38280 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
38290 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  y );..  TRACE(("
382a0 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
382b0 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
382c0 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
382d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
382e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
382f0 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
38300 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
38310 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
38320 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
38330 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
38340 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
38350 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  ;.  allocateTemp
38360 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65  Space(pBt);.  ne
38370 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  wCell = pBt->pTm
38380 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65  pSpace;.  if( ne
38390 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
383a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
383b0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
383c0 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
383d0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
383e0 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72  ata, nData, nZer
383f0 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66  o, &szNew);.  if
38400 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
38410 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74  insert;.  assert
38420 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a  ( szNew==cellSiz
38430 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43  ePtr(pPage, newC
38440 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
38450 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c  ( szNew<=MX_CELL
38460 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
38470 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
38480 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
38490 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a    if( loc==0 ){.
384a0 20 20 20 20 75 31 36 20 73 7a 4f 6c 6