/ Hex Artifact Content
Login

Artifact 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4d 61 79 20 32  /*.** 2005 May 2
0010: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  5.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
0190: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
01a0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
01b0: 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  ().** interface,
01c0: 20 61 6e 64 20 72 6f 75 74 69 6e 65 73 20 74 68   and routines th
01d0: 61 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  at contribute to
01e0: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
01f0: 61 62 61 73 65 20 73 63 68 65 6d 61 0a 2a 2a 20  abase schema.** 
0200: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 23 69  from disk..*/.#i
0210: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0220: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  t.h"../*.** Fill
0230: 20 74 68 65 20 49 6e 69 74 44 61 74 61 20 73 74   the InitData st
0240: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6e 20  ructure with an 
0250: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 68  error message th
0260: 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  at indicates.** 
0270: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
0280: 65 20 69 73 20 63 6f 72 72 75 70 74 2e 0a 2a 2f  e is corrupt..*/
0290: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 72  .static void cor
02a0: 72 75 70 74 53 63 68 65 6d 61 28 0a 20 20 49 6e  ruptSchema(.  In
02b0: 69 74 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  itData *pData,  
02c0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61     /* Initializa
02d0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  tion context */.
02e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
02f0: 62 6a 2c 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74  bj,    /* Object
0300: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 74   being parsed at
0310: 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 65 72   the point of er
0320: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
0330: 68 61 72 20 2a 7a 45 78 74 72 61 20 20 20 2f 2a  har *zExtra   /*
0340: 20 45 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   Error informati
0350: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
0360: 65 33 20 2a 64 62 20 3d 20 70 44 61 74 61 2d 3e  e3 *db = pData->
0370: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
0380: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
0390: 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 53 51    pData->rc = SQ
03a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
03b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 61  .  }else if( pDa
03c0: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 5b 30 5d 21  ta->pzErrMsg[0]!
03d0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 65  =0 ){.    /* A e
03e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 61 73  rror message has
03f0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
0400: 6e 65 72 61 74 65 64 2e 20 20 44 6f 20 6e 6f 74  nerated.  Do not
0410: 20 6f 76 65 72 77 72 69 74 65 20 69 74 20 2a 2f   overwrite it */
0420: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 61  .  }else if( pDa
0430: 74 61 2d 3e 6d 49 6e 69 74 46 6c 61 67 73 20 26  ta->mInitFlags &
0440: 20 49 4e 49 54 46 4c 41 47 5f 41 6c 74 65 72 54   INITFLAG_AlterT
0450: 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a 70 44 61  able ){.    *pDa
0460: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 20 3d 20 73  ta->pzErrMsg = s
0470: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
0480: 62 2c 20 7a 45 78 74 72 61 29 3b 0a 20 20 20 20  b, zExtra);.    
0490: 70 44 61 74 61 2d 3e 72 63 20 3d 20 53 51 4c 49  pData->rc = SQLI
04a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
04b0: 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20  e if( db->flags 
04c0: 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
04d0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 44 61 74  hema ){.    pDat
04e0: 61 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  a->rc = SQLITE_C
04f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
0500: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
0510: 7a 3b 0a 20 20 20 20 69 66 28 20 7a 4f 62 6a 3d  z;.    if( zObj=
0520: 3d 30 20 29 20 7a 4f 62 6a 20 3d 20 22 3f 22 3b  =0 ) zObj = "?";
0530: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
0540: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6d 61 6c  MPrintf(db, "mal
0550: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
0560: 73 63 68 65 6d 61 20 28 25 73 29 22 2c 20 7a 4f  schema (%s)", zO
0570: 62 6a 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  bj);.    if( zEx
0580: 74 72 61 20 26 26 20 7a 45 78 74 72 61 5b 30 5d  tra && zExtra[0]
0590: 20 29 20 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50   ) z = sqlite3MP
05a0: 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 2d 20  rintf(db, "%z - 
05b0: 25 73 22 2c 20 7a 2c 20 7a 45 78 74 72 61 29 3b  %s", z, zExtra);
05c0: 0a 20 20 20 20 2a 70 44 61 74 61 2d 3e 70 7a 45  .    *pData->pzE
05d0: 72 72 4d 73 67 20 3d 20 7a 3b 0a 20 20 20 20 70  rrMsg = z;.    p
05e0: 44 61 74 61 2d 3e 72 63 20 3d 20 53 51 4c 49 54  Data->rc = SQLIT
05f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
0600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
0610: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
0620: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  k routine for th
0630: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
0640: 69 61 6c 69 7a 65 73 20 74 68 65 0a 2a 2a 20 64  ializes the.** d
0650: 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 73 71  atabase.  See sq
0660: 6c 69 74 65 33 49 6e 69 74 28 29 20 62 65 6c 6f  lite3Init() belo
0670: 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  w for additional
0680: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
0690: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
06a0: 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 66 72 6f   also called fro
06b0: 6d 20 74 68 65 20 4f 50 5f 50 61 72 73 65 53 63  m the OP_ParseSc
06c0: 68 65 6d 61 20 6f 70 63 6f 64 65 20 6f 66 20 74  hema opcode of t
06d0: 68 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a 2a 20 45  he VDBE..**.** E
06e0: 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e  ach callback con
06f0: 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tains the follow
0700: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a  ing information:
0710: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  .**.**     argv[
0720: 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 69  0] = name of thi
0730: 6e 67 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  ng being created
0740: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20  .**     argv[1] 
0750: 3d 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  = root page numb
0760: 65 72 20 66 6f 72 20 74 61 62 6c 65 20 6f 72 20  er for table or 
0770: 69 6e 64 65 78 2e 20 30 20 66 6f 72 20 74 72 69  index. 0 for tri
0780: 67 67 65 72 20 6f 72 20 76 69 65 77 2e 0a 2a 2a  gger or view..**
0790: 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 53       argv[2] = S
07a0: 51 4c 20 74 65 78 74 20 66 6f 72 20 74 68 65 20  QL text for the 
07b0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
07c0: 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
07d0: 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28  te3InitCallback(
07e0: 76 6f 69 64 20 2a 70 49 6e 69 74 2c 20 69 6e 74  void *pInit, int
07f0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
0800: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
0810: 65 64 29 7b 0a 20 20 49 6e 69 74 44 61 74 61 20  ed){.  InitData 
0820: 2a 70 44 61 74 61 20 3d 20 28 49 6e 69 74 44 61  *pData = (InitDa
0830: 74 61 2a 29 70 49 6e 69 74 3b 0a 20 20 73 71 6c  ta*)pInit;.  sql
0840: 69 74 65 33 20 2a 64 62 20 3d 20 70 44 61 74 61  ite3 *db = pData
0850: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 20  ->db;.  int iDb 
0860: 3d 20 70 44 61 74 61 2d 3e 69 44 62 3b 0a 0a 20  = pData->iDb;.. 
0870: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
0880: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
0890: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
08a0: 20 61 72 67 63 29 3b 0a 20 20 61 73 73 65 72 74   argc);.  assert
08b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
08c0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
08d0: 29 3b 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70  );.  DbClearProp
08e0: 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
08f0: 5f 45 6d 70 74 79 29 3b 0a 20 20 70 44 61 74 61  _Empty);.  pData
0900: 2d 3e 6e 49 6e 69 74 52 6f 77 2b 2b 3b 0a 20 20  ->nInitRow++;.  
0910: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0920: 69 6c 65 64 20 29 7b 0a 20 20 20 20 63 6f 72 72  iled ){.    corr
0930: 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c  uptSchema(pData,
0940: 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20   argv[0], 0);.  
0950: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
0960: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
0970: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
0980: 20 29 3b 0a 20 20 69 66 28 20 61 72 67 76 3d 3d   );.  if( argv==
0990: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
09a0: 2f 2a 20 4d 69 67 68 74 20 68 61 70 70 65 6e 20  /* Might happen 
09b0: 69 66 20 45 4d 50 54 59 5f 52 45 53 55 4c 54 5f  if EMPTY_RESULT_
09c0: 43 41 4c 4c 42 41 43 4b 53 20 61 72 65 20 6f 6e  CALLBACKS are on
09d0: 20 2a 2f 0a 20 20 69 66 28 20 61 72 67 76 5b 31   */.  if( argv[1
09e0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 72 72  ]==0 ){.    corr
09f0: 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c  uptSchema(pData,
0a00: 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20   argv[0], 0);.  
0a10: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
0a20: 33 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76 5b  3_strnicmp(argv[
0a30: 32 5d 2c 22 63 72 65 61 74 65 20 22 2c 37 29 3d  2],"create ",7)=
0a40: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6c  =0 ){.    /* Cal
0a50: 6c 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  l the parser to 
0a60: 70 72 6f 63 65 73 73 20 61 20 43 52 45 41 54 45  process a CREATE
0a70: 20 54 41 42 4c 45 2c 20 49 4e 44 45 58 20 6f 72   TABLE, INDEX or
0a80: 20 56 49 45 57 2e 0a 20 20 20 20 2a 2a 20 42 75   VIEW..    ** Bu
0a90: 74 20 62 65 63 61 75 73 65 20 64 62 2d 3e 69 6e  t because db->in
0aa0: 69 74 2e 62 75 73 79 20 69 73 20 73 65 74 20 74  it.busy is set t
0ab0: 6f 20 31 2c 20 6e 6f 20 56 44 42 45 20 63 6f 64  o 1, no VDBE cod
0ac0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 0a 20  e is generated. 
0ad0: 20 20 20 2a 2a 20 6f 72 20 65 78 65 63 75 74 65     ** or execute
0ae0: 64 2e 20 20 41 6c 6c 20 74 68 65 20 70 61 72 73  d.  All the pars
0af0: 65 72 20 64 6f 65 73 20 69 73 20 62 75 69 6c 64  er does is build
0b00: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 61   the internal da
0b10: 74 61 0a 20 20 20 20 2a 2a 20 73 74 72 75 63 74  ta.    ** struct
0b20: 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
0b30: 62 65 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  be the table, in
0b40: 64 65 78 2c 20 6f 72 20 76 69 65 77 2e 0a 20 20  dex, or view..  
0b50: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
0b60: 0a 20 20 20 20 75 38 20 73 61 76 65 64 5f 69 44  .    u8 saved_iD
0b70: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
0b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
0b90: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 54  mt *pStmt;.    T
0ba0: 45 53 54 4f 4e 4c 59 28 69 6e 74 20 72 63 70 29  ESTONLY(int rcp)
0bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0bc0: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
0bd0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
0be0: 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  () */..    asser
0bf0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
0c00: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74   );.    db->init
0c10: 2e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20  .iDb = iDb;.    
0c20: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
0c30: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 61   = sqlite3Atoi(a
0c40: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 64 62 2d  rgv[1]);.    db-
0c50: 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69 67  >init.orphanTrig
0c60: 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 54 45 53  ger = 0;.    TES
0c70: 54 4f 4e 4c 59 28 72 63 70 20 3d 20 29 20 73 71  TONLY(rcp = ) sq
0c80: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
0c90: 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 26  , argv[2], -1, &
0ca0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 72  pStmt, 0);.    r
0cb0: 63 20 3d 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  c = db->errCode;
0cc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
0cd0: 26 30 78 46 46 29 3d 3d 28 72 63 70 26 30 78 46  &0xFF)==(rcp&0xF
0ce0: 46 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e  F) );.    db->in
0cf0: 69 74 2e 69 44 62 20 3d 20 73 61 76 65 64 5f 69  it.iDb = saved_i
0d00: 44 62 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  Db;.    /* asser
0d10: 74 28 20 73 61 76 65 64 5f 69 44 62 3d 3d 30 20  t( saved_iDb==0 
0d20: 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  || (db->mDbFlags
0d30: 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
0d40: 29 21 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69  )!=0 ); */.    i
0d50: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
0d60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62   ){.      if( db
0d70: 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69  ->init.orphanTri
0d80: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  gger ){.        
0d90: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 29  assert( iDb==1 )
0da0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0db0: 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 72 63         pData->rc
0dc0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69   = rc;.        i
0dd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
0de0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MEM ){.         
0df0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e00: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
0e10: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
0e20: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 26 26 20  TE_INTERRUPT && 
0e30: 28 72 63 26 30 78 46 46 29 21 3d 53 51 4c 49 54  (rc&0xFF)!=SQLIT
0e40: 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
0e50: 20 20 20 20 20 20 63 6f 72 72 75 70 74 53 63 68        corruptSch
0e60: 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b  ema(pData, argv[
0e70: 30 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  0], sqlite3_errm
0e80: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20  sg(db));.       
0e90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
0ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
0eb0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
0ec0: 7d 65 6c 73 65 20 69 66 28 20 61 72 67 76 5b 30  }else if( argv[0
0ed0: 5d 3d 3d 30 20 7c 7c 20 28 61 72 67 76 5b 32 5d  ]==0 || (argv[2]
0ee0: 21 3d 30 20 26 26 20 61 72 67 76 5b 32 5d 5b 30  !=0 && argv[2][0
0ef0: 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 63 6f 72  ]!=0) ){.    cor
0f00: 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61  ruptSchema(pData
0f10: 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20  , argv[0], 0);. 
0f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
0f30: 66 20 74 68 65 20 53 51 4c 20 63 6f 6c 75 6d 6e  f the SQL column
0f40: 20 69 73 20 62 6c 61 6e 6b 20 69 74 20 6d 65 61   is blank it mea
0f50: 6e 73 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  ns this is an in
0f60: 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
0f70: 77 61 73 20 63 72 65 61 74 65 64 20 74 6f 20 62  was created to b
0f80: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
0f90: 59 20 6f 72 20 74 6f 20 66 75 6c 66 69 6c 6c 20  Y or to fulfill 
0fa0: 61 20 55 4e 49 51 55 45 0a 20 20 20 20 2a 2a 20  a UNIQUE.    ** 
0fb0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 61  constraint for a
0fc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 2e 20 20   CREATE TABLE.  
0fd0: 54 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  The index should
0fe0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
0ff0: 20 20 2a 2a 20 62 65 65 6e 20 63 72 65 61 74 65    ** been create
1000: 64 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73  d when we proces
1010: 73 65 64 20 74 68 65 20 43 52 45 41 54 45 20 54  sed the CREATE T
1020: 41 42 4c 45 2e 20 20 41 6c 6c 20 77 65 20 68 61  ABLE.  All we ha
1030: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ve.    ** to do 
1040: 68 65 72 65 20 69 73 20 72 65 63 6f 72 64 20 74  here is record t
1050: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
1060: 62 65 72 20 66 6f 72 20 74 68 61 74 20 69 6e 64  ber for that ind
1070: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  ex..    */.    I
1080: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1090: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
10a0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
10b0: 61 72 67 76 5b 30 5d 2c 20 64 62 2d 3e 61 44 62  argv[0], db->aDb
10c0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b  [iDb].zDbSName);
10d0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 3d  .    if( pIndex=
10e0: 3d 30 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  =0.     || sqlit
10f0: 65 33 47 65 74 49 6e 74 33 32 28 61 72 67 76 5b  e3GetInt32(argv[
1100: 31 5d 2c 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  1],&pIndex->tnum
1110: 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 70 49 6e  )==0.     || pIn
1120: 64 65 78 2d 3e 74 6e 75 6d 3c 32 0a 20 20 20 20  dex->tnum<2.    
1130: 29 7b 0a 20 20 20 20 20 20 63 6f 72 72 75 70 74  ){.      corrupt
1140: 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72  Schema(pData, ar
1150: 67 76 5b 30 5d 2c 20 70 49 6e 64 65 78 3f 22 69  gv[0], pIndex?"i
1160: 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61 67 65 22  nvalid rootpage"
1170: 3a 22 6f 72 70 68 61 6e 20 69 6e 64 65 78 22 29  :"orphan index")
1180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1190: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11a0: 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   Attempt to read
11b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11c0: 68 65 6d 61 20 61 6e 64 20 69 6e 69 74 69 61 6c  hema and initial
11d0: 69 7a 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  ize internal.** 
11e0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
11f0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
1200: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
1210: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
1220: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1230: 73 20 67 69 76 65 6e 20 62 79 20 69 44 62 2e 20  s given by iDb. 
1240: 20 69 44 62 3d 3d 30 20 69 73 20 75 73 65 64 20   iDb==0 is used 
1250: 66 6f 72 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  for the main.** 
1260: 64 61 74 61 62 61 73 65 2e 20 20 69 44 62 3d 3d  database.  iDb==
1270: 31 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  1 should never b
1280: 65 20 75 73 65 64 2e 20 20 69 44 62 3e 3d 32 20  e used.  iDb>=2 
1290: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61  is used for.** a
12a0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
12b0: 65 73 2e 20 20 52 65 74 75 72 6e 20 6f 6e 65 20  es.  Return one 
12c0: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 20 65  of the SQLITE_ e
12d0: 72 72 6f 72 20 63 6f 64 65 73 20 74 6f 0a 2a 2a  rror codes to.**
12e0: 20 69 6e 64 69 63 61 74 65 20 73 75 63 63 65 73   indicate succes
12f0: 73 20 6f 72 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  s or failure..*/
1300: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 69 74  .int sqlite3Init
1310: 4f 6e 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  One(sqlite3 *db,
1320: 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a   int iDb, char *
1330: 2a 70 7a 45 72 72 4d 73 67 2c 20 75 33 32 20 6d  *pzErrMsg, u32 m
1340: 46 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  Flags){.  int rc
1350: 3b 0a 20 20 69 6e 74 20 69 3b 0a 23 69 66 6e 64  ;.  int i;.#ifnd
1360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1370: 45 50 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20  EPRECATED.  int 
1380: 73 69 7a 65 3b 0a 23 65 6e 64 69 66 0a 20 20 44  size;.#endif.  D
1390: 62 20 2a 70 44 62 3b 0a 20 20 63 68 61 72 20 63  b *pDb;.  char c
13a0: 6f 6e 73 74 20 2a 61 7a 41 72 67 5b 34 5d 3b 0a  onst *azArg[4];.
13b0: 20 20 69 6e 74 20 6d 65 74 61 5b 35 5d 3b 0a 20    int meta[5];. 
13c0: 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61   InitData initDa
13d0: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
13e0: 20 2a 7a 4d 61 73 74 65 72 4e 61 6d 65 3b 0a 20   *zMasterName;. 
13f0: 20 69 6e 74 20 6f 70 65 6e 65 64 54 72 61 6e 73   int openedTrans
1400: 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 61  action = 0;..  a
1410: 73 73 65 72 74 28 20 28 64 62 2d 3e 6d 44 62 46  ssert( (db->mDbF
1420: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63  lags & DBFLAG_Sc
1430: 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20  hemaKnownOk)==0 
1440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
1450: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
1460: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
1470: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1480: 68 65 6d 61 20 29 3b 0a 20 20 61 73 73 65 72 74  hema );.  assert
1490: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14a0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
14b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
14c0: 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  ==1 || sqlite3Bt
14d0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62  reeHoldsMutex(db
14e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20  ->aDb[iDb].pBt) 
14f0: 29 3b 0a 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62  );..  db->init.b
1500: 75 73 79 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 43  usy = 1;..  /* C
1510: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6e 2d  onstruct the in-
1520: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
1530: 61 74 69 6f 6e 20 73 63 68 65 6d 61 20 74 61 62  ation schema tab
1540: 6c 65 73 20 28 73 71 6c 69 74 65 5f 6d 61 73 74  les (sqlite_mast
1550: 65 72 20 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  er or.  ** sqlit
1560: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 62  e_temp_master) b
1570: 79 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 70  y invoking the p
1580: 61 72 73 65 72 20 64 69 72 65 63 74 6c 79 2e 20  arser directly. 
1590: 20 54 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   The appropriate
15a0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65  .  ** table name
15b0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
15c0: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
15d0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 73 6f  by the parser so
15e0: 20 77 65 20 63 61 6e 20 6a 75 73 74 0a 20 20 2a   we can just.  *
15f0: 2a 20 75 73 65 20 74 68 65 20 61 62 62 72 65 76  * use the abbrev
1600: 69 61 74 69 6f 6e 20 22 78 22 20 68 65 72 65 2e  iation "x" here.
1610: 20 20 54 68 65 20 70 61 72 73 65 72 20 77 69 6c    The parser wil
1620: 6c 20 61 6c 73 6f 20 61 75 74 6f 6d 61 74 69 63  l also automatic
1630: 61 6c 6c 79 20 74 61 67 0a 20 20 2a 2a 20 74 68  ally tag.  ** th
1640: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 61  e schema table a
1650: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  s read-only. */.
1660: 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 7a 4d 61    azArg[0] = zMa
1670: 73 74 65 72 4e 61 6d 65 20 3d 20 53 43 48 45 4d  sterName = SCHEM
1680: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1690: 61 7a 41 72 67 5b 31 5d 20 3d 20 22 31 22 3b 0a  azArg[1] = "1";.
16a0: 20 20 61 7a 41 72 67 5b 32 5d 20 3d 20 22 43 52    azArg[2] = "CR
16b0: 45 41 54 45 20 54 41 42 4c 45 20 78 28 74 79 70  EATE TABLE x(typ
16c0: 65 20 74 65 78 74 2c 6e 61 6d 65 20 74 65 78 74  e text,name text
16d0: 2c 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 22  ,tbl_name text,"
16e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f               "ro
1700: 6f 74 70 61 67 65 20 69 6e 74 2c 73 71 6c 20 74  otpage int,sql t
1710: 65 78 74 29 22 3b 0a 20 20 61 7a 41 72 67 5b 33  ext)";.  azArg[3
1720: 5d 20 3d 20 30 3b 0a 20 20 69 6e 69 74 44 61 74  ] = 0;.  initDat
1730: 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 69 6e 69  a.db = db;.  ini
1740: 74 44 61 74 61 2e 69 44 62 20 3d 20 69 44 62 3b  tData.iDb = iDb;
1750: 0a 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d  .  initData.rc =
1760: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1770: 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20  itData.pzErrMsg 
1780: 3d 20 70 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e  = pzErrMsg;.  in
1790: 69 74 44 61 74 61 2e 6d 49 6e 69 74 46 6c 61 67  itData.mInitFlag
17a0: 73 20 3d 20 6d 46 6c 61 67 73 3b 0a 20 20 69 6e  s = mFlags;.  in
17b0: 69 74 44 61 74 61 2e 6e 49 6e 69 74 52 6f 77 20  itData.nInitRow 
17c0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e  = 0;.  sqlite3In
17d0: 69 74 43 61 6c 6c 62 61 63 6b 28 26 69 6e 69 74  itCallback(&init
17e0: 44 61 74 61 2c 20 33 2c 20 28 63 68 61 72 20 2a  Data, 3, (char *
17f0: 2a 29 61 7a 41 72 67 2c 20 30 29 3b 0a 20 20 69  *)azArg, 0);.  i
1800: 66 28 20 69 6e 69 74 44 61 74 61 2e 72 63 20 29  f( initData.rc )
1810: 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69 74 44  {.    rc = initD
1820: 61 74 61 2e 72 63 3b 0a 20 20 20 20 67 6f 74 6f  ata.rc;.    goto
1830: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
1840: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 63  .  /* Create a c
1850: 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64 20 74 68  ursor to hold th
1860: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 0a  e database open.
1870: 20 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62    */.  pDb = &db
1880: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 69 66  ->aDb[iDb];.  if
1890: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
18a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
18b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 44 62 53 65 74  ==1 );.    DbSet
18c0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20  Property(db, 1, 
18d0: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
18e0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
18f0: 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  E_OK;.    goto e
1900: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1910: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1920: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 72 65  not already a re
1930: 61 64 2d 6f 6e 6c 79 20 28 6f 72 20 72 65 61 64  ad-only (or read
1940: 2d 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74  -write) transact
1950: 69 6f 6e 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20  ion opened.  ** 
1960: 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 64 61  on the b-tree da
1970: 74 61 62 61 73 65 2c 20 6f 70 65 6e 20 6f 6e 65  tabase, open one
1980: 20 6e 6f 77 2e 20 49 66 20 61 20 74 72 61 6e 73   now. If a trans
1990: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
19a0: 2c 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c 6c 20  , it .  ** will 
19b0: 62 65 20 63 6c 6f 73 65 64 20 62 65 66 6f 72 65  be closed before
19c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19d0: 65 74 75 72 6e 73 2e 20 20 2a 2f 0a 20 20 73 71  eturns.  */.  sq
19e0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19f0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 69 66 28  pDb->pBt);.  if(
1a00: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
1a10: 49 6e 52 65 61 64 54 72 61 6e 73 28 70 44 62 2d  InReadTrans(pDb-
1a20: 3e 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  >pBt) ){.    rc 
1a30: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
1a40: 67 69 6e 54 72 61 6e 73 28 70 44 62 2d 3e 70 42  ginTrans(pDb->pB
1a50: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
1a60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a80: 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
1a90: 73 67 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  sg, db, sqlite3E
1aa0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
1ab0: 20 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65    goto initone_e
1ac0: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
1ad0: 20 20 20 20 6f 70 65 6e 65 64 54 72 61 6e 73 61      openedTransa
1ae0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ction = 1;.  }..
1af0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 64 61 74    /* Get the dat
1b00: 61 62 61 73 65 20 6d 65 74 61 20 69 6e 66 6f 72  abase meta infor
1b10: 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  mation..  **.  *
1b20: 2a 20 4d 65 74 61 20 76 61 6c 75 65 73 20 61 72  * Meta values ar
1b30: 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  e as follows:.  
1b40: 2a 2a 20 20 20 20 6d 65 74 61 5b 30 5d 20 20 20  **    meta[0]   
1b50: 53 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  Schema cookie.  
1b60: 43 68 61 6e 67 65 73 20 77 69 74 68 20 65 61 63  Changes with eac
1b70: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e  h schema change.
1b80: 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 31 5d  .  **    meta[1]
1b90: 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 6f     File format o
1ba0: 66 20 73 63 68 65 6d 61 20 6c 61 79 65 72 2e 0a  f schema layer..
1bb0: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 32 5d 20    **    meta[2] 
1bc0: 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61    Size of the pa
1bd0: 67 65 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 20  ge cache..  **  
1be0: 20 20 6d 65 74 61 5b 33 5d 20 20 20 4c 61 72 67    meta[3]   Larg
1bf0: 65 73 74 20 72 6f 6f 74 70 61 67 65 20 28 61 75  est rootpage (au
1c00: 74 6f 2f 69 6e 63 72 5f 76 61 63 75 75 6d 20 6d  to/incr_vacuum m
1c10: 6f 64 65 29 0a 20 20 2a 2a 20 20 20 20 6d 65 74  ode).  **    met
1c20: 61 5b 34 5d 20 20 20 44 62 20 74 65 78 74 20 65  a[4]   Db text e
1c30: 6e 63 6f 64 69 6e 67 2e 20 31 3a 55 54 46 2d 38  ncoding. 1:UTF-8
1c40: 20 32 3a 55 54 46 2d 31 36 4c 45 20 33 3a 55 54   2:UTF-16LE 3:UT
1c50: 46 2d 31 36 42 45 0a 20 20 2a 2a 20 20 20 20 6d  F-16BE.  **    m
1c60: 65 74 61 5b 35 5d 20 20 20 55 73 65 72 20 76 65  eta[5]   User ve
1c70: 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6d 65  rsion.  **    me
1c80: 74 61 5b 36 5d 20 20 20 49 6e 63 72 65 6d 65 6e  ta[6]   Incremen
1c90: 74 61 6c 20 76 61 63 75 75 6d 20 6d 6f 64 65 0a  tal vacuum mode.
1ca0: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 37 5d 20    **    meta[7] 
1cb0: 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20    unused.  **   
1cc0: 20 6d 65 74 61 5b 38 5d 20 20 20 75 6e 75 73 65   meta[8]   unuse
1cd0: 64 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 39  d.  **    meta[9
1ce0: 5d 20 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a 0a  ]   unused.  **.
1cf0: 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 65 20 23    ** Note: The #
1d00: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 55  defined SQLITE_U
1d10: 54 46 2a 20 73 79 6d 62 6f 6c 73 20 69 6e 20 73  TF* symbols in s
1d20: 71 6c 69 74 65 49 6e 74 2e 68 20 63 6f 72 72 65  qliteInt.h corre
1d30: 73 70 6f 6e 64 20 74 6f 0a 20 20 2a 2a 20 74 68  spond to.  ** th
1d40: 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  e possible value
1d50: 73 20 6f 66 20 6d 65 74 61 5b 34 5d 2e 0a 20 20  s of meta[4]..  
1d60: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1d70: 41 72 72 61 79 53 69 7a 65 28 6d 65 74 61 29 3b  ArraySize(meta);
1d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1d90: 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
1da0: 44 62 2d 3e 70 42 74 2c 20 69 2b 31 2c 20 28 75  Db->pBt, i+1, (u
1db0: 33 32 20 2a 29 26 6d 65 74 61 5b 69 5d 29 3b 0a  32 *)&meta[i]);.
1dc0: 20 20 7d 0a 20 20 69 66 28 20 28 64 62 2d 3e 66    }.  if( (db->f
1dd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1de0: 73 65 74 44 61 74 61 62 61 73 65 29 21 3d 30 20  setDatabase)!=0 
1df0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6d 65  ){.    memset(me
1e00: 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 65  ta, 0, sizeof(me
1e10: 74 61 29 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  ta));.  }.  pDb-
1e20: 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
1e30: 5f 63 6f 6f 6b 69 65 20 3d 20 6d 65 74 61 5b 42  _cookie = meta[B
1e40: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
1e50: 49 4f 4e 2d 31 5d 3b 0a 0a 20 20 2f 2a 20 49 66  ION-1];..  /* If
1e60: 20 6f 70 65 6e 69 6e 67 20 61 20 6e 6f 6e 2d 65   opening a non-e
1e70: 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 63  mpty database, c
1e80: 68 65 63 6b 20 74 68 65 20 74 65 78 74 20 65 6e  heck the text en
1e90: 63 6f 64 69 6e 67 2e 20 46 6f 72 20 74 68 65 0a  coding. For the.
1ea0: 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61    ** main databa
1eb0: 73 65 2c 20 73 65 74 20 73 71 6c 69 74 65 33 2e  se, set sqlite3.
1ec0: 65 6e 63 20 74 6f 20 74 68 65 20 65 6e 63 6f 64  enc to the encod
1ed0: 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ing of the main 
1ee0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 46  database..  ** F
1ef0: 6f 72 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  or an attached d
1f00: 62 2c 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f  b, it is an erro
1f10: 72 20 69 66 20 74 68 65 20 65 6e 63 6f 64 69 6e  r if the encodin
1f20: 67 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  g is not the sam
1f30: 65 0a 20 20 2a 2a 20 61 73 20 73 71 6c 69 74 65  e.  ** as sqlite
1f40: 33 2e 65 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  3.enc..  */.  if
1f50: 28 20 6d 65 74 61 5b 42 54 52 45 45 5f 54 45 58  ( meta[BTREE_TEX
1f60: 54 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 20 29 7b  T_ENCODING-1] ){
1f70: 20 20 2f 2a 20 74 65 78 74 20 65 6e 63 6f 64 69    /* text encodi
1f80: 6e 67 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44  ng */.    if( iD
1f90: 62 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  b==0 ){.#ifndef 
1fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1fb0: 36 0a 20 20 20 20 20 20 75 38 20 65 6e 63 6f 64  6.      u8 encod
1fc0: 69 6e 67 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ing;.      /* If
1fd0: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6d 61 69   opening the mai
1fe0: 6e 20 64 61 74 61 62 61 73 65 2c 20 73 65 74 20  n database, set 
1ff0: 45 4e 43 28 64 62 29 2e 20 2a 2f 0a 20 20 20 20  ENC(db). */.    
2000: 20 20 65 6e 63 6f 64 69 6e 67 20 3d 20 28 75 38    encoding = (u8
2010: 29 6d 65 74 61 5b 42 54 52 45 45 5f 54 45 58 54  )meta[BTREE_TEXT
2020: 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 20 26 20 33  _ENCODING-1] & 3
2030: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63 6f  ;.      if( enco
2040: 64 69 6e 67 3d 3d 30 20 29 20 65 6e 63 6f 64 69  ding==0 ) encodi
2050: 6e 67 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  ng = SQLITE_UTF8
2060: 3b 0a 20 20 20 20 20 20 45 4e 43 28 64 62 29 20  ;.      ENC(db) 
2070: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 23 65 6c 73  = encoding;.#els
2080: 65 0a 20 20 20 20 20 20 45 4e 43 28 64 62 29 20  e.      ENC(db) 
2090: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
20a0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
20b0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6f 70 65  .      /* If ope
20c0: 6e 69 6e 67 20 61 6e 20 61 74 74 61 63 68 65 64  ning an attached
20d0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 65   database, the e
20e0: 6e 63 6f 64 69 6e 67 20 6d 75 63 68 20 6d 61 74  ncoding much mat
20f0: 63 68 20 45 4e 43 28 64 62 29 20 2a 2f 0a 20 20  ch ENC(db) */.  
2100: 20 20 20 20 69 66 28 20 6d 65 74 61 5b 42 54 52      if( meta[BTR
2110: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
2120: 2d 31 5d 21 3d 45 4e 43 28 64 62 29 20 29 7b 0a  -1]!=ENC(db) ){.
2130: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
2140: 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
2150: 67 2c 20 64 62 2c 20 22 61 74 74 61 63 68 65 64  g, db, "attached
2160: 20 64 61 74 61 62 61 73 65 73 20 6d 75 73 74 20   databases must 
2170: 75 73 65 20 74 68 65 20 73 61 6d 65 22 0a 20 20  use the same".  
2180: 20 20 20 20 20 20 20 20 20 20 22 20 74 65 78 74            " text
2190: 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 6d 61 69   encoding as mai
21a0: 6e 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  n database");.  
21b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
21d0: 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72   goto initone_er
21e0: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
21f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2200: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
2210: 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 45 6d  y(db, iDb, DB_Em
2220: 70 74 79 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  pty);.  }.  pDb-
2230: 3e 70 53 63 68 65 6d 61 2d 3e 65 6e 63 20 3d 20  >pSchema->enc = 
2240: 45 4e 43 28 64 62 29 3b 0a 0a 20 20 69 66 28 20  ENC(db);..  if( 
2250: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
2260: 63 68 65 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 23  che_size==0 ){.#
2270: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2280: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
2290: 20 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33    size = sqlite3
22a0: 41 62 73 49 6e 74 33 32 28 6d 65 74 61 5b 42 54  AbsInt32(meta[BT
22b0: 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  REE_DEFAULT_CACH
22c0: 45 5f 53 49 5a 45 2d 31 5d 29 3b 0a 20 20 20 20  E_SIZE-1]);.    
22d0: 69 66 28 20 73 69 7a 65 3d 3d 30 20 29 7b 20 73  if( size==0 ){ s
22e0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
22f0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b  AULT_CACHE_SIZE;
2300: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68   }.    pDb->pSch
2310: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  ema->cache_size 
2320: 3d 20 73 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  = size;.#else.  
2330: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
2340: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 53 51 4c  cache_size = SQL
2350: 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
2360: 45 5f 53 49 5a 45 3b 0a 23 65 6e 64 69 66 0a 20  E_SIZE;.#endif. 
2370: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
2380: 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d  etCacheSize(pDb-
2390: 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65  >pBt, pDb->pSche
23a0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  ma->cache_size);
23b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
23c0: 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 31 20 20  file_format==1  
23d0: 20 20 56 65 72 73 69 6f 6e 20 33 2e 30 2e 30 2e    Version 3.0.0.
23e0: 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61  .  ** file_forma
23f0: 74 3d 3d 32 20 20 20 20 56 65 72 73 69 6f 6e 20  t==2    Version 
2400: 33 2e 31 2e 33 2e 20 20 2f 2f 20 41 4c 54 45 52  3.1.3.  // ALTER
2410: 20 54 41 42 4c 45 20 41 44 44 20 43 4f 4c 55 4d   TABLE ADD COLUM
2420: 4e 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d  N.  ** file_form
2430: 61 74 3d 3d 33 20 20 20 20 56 65 72 73 69 6f 6e  at==3    Version
2440: 20 33 2e 31 2e 34 2e 20 20 2f 2f 20 64 69 74 74   3.1.4.  // ditt
2450: 6f 20 62 75 74 20 77 69 74 68 20 6e 6f 6e 2d 4e  o but with non-N
2460: 55 4c 4c 20 64 65 66 61 75 6c 74 73 0a 20 20 2a  ULL defaults.  *
2470: 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 34  * file_format==4
2480: 20 20 20 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e      Version 3.3.
2490: 30 2e 20 20 2f 2f 20 44 45 53 43 20 69 6e 64 69  0.  // DESC indi
24a0: 63 65 73 2e 20 20 42 6f 6f 6c 65 61 6e 20 63 6f  ces.  Boolean co
24b0: 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 70  nstants.  */.  p
24c0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
24d0: 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 6d  e_format = (u8)m
24e0: 65 74 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f 46  eta[BTREE_FILE_F
24f0: 4f 52 4d 41 54 2d 31 5d 3b 0a 20 20 69 66 28 20  ORMAT-1];.  if( 
2500: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
2510: 6c 65 5f 66 6f 72 6d 61 74 3d 3d 30 20 29 7b 0a  le_format==0 ){.
2520: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
2530: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20  ->file_format = 
2540: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  1;.  }.  if( pDb
2550: 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
2560: 66 6f 72 6d 61 74 3e 53 51 4c 49 54 45 5f 4d 41  format>SQLITE_MA
2570: 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b  X_FILE_FORMAT ){
2580: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
2590: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
25a0: 64 62 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64  db, "unsupported
25b0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 22 29 3b 0a   file format");.
25c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d0: 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20  ERROR;.    goto 
25e0: 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75  initone_error_ou
25f0: 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 69 63  t;.  }..  /* Tic
2600: 6b 65 74 20 23 32 38 30 34 3a 20 20 57 68 65 6e  ket #2804:  When
2610: 20 77 65 20 6f 70 65 6e 20 61 20 64 61 74 61 62   we open a datab
2620: 61 73 65 20 69 6e 20 74 68 65 20 6e 65 77 65 72  ase in the newer
2630: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 20 20   file format,.  
2640: 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 6c 65 67  ** clear the leg
2650: 61 63 79 5f 66 69 6c 65 5f 66 6f 72 6d 61 74 20  acy_file_format 
2660: 70 72 61 67 6d 61 20 66 6c 61 67 20 73 6f 20 74  pragma flag so t
2670: 68 61 74 20 61 20 56 41 43 55 55 4d 20 77 69 6c  hat a VACUUM wil
2680: 6c 0a 20 20 2a 2a 20 6e 6f 74 20 64 6f 77 6e 67  l.  ** not downg
2690: 72 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  rade the databas
26a0: 65 20 61 6e 64 20 74 68 75 73 20 69 6e 76 61 6c  e and thus inval
26b0: 69 64 61 74 65 20 61 6e 79 20 64 65 73 63 65 6e  idate any descen
26c0: 64 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ding.  ** indice
26d0: 73 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  s that the user 
26e0: 6d 69 67 68 74 20 68 61 76 65 20 63 72 65 61 74  might have creat
26f0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
2700: 44 62 3d 3d 30 20 26 26 20 6d 65 74 61 5b 42 54  Db==0 && meta[BT
2710: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2d  REE_FILE_FORMAT-
2720: 31 5d 3e 3d 34 20 29 7b 0a 20 20 20 20 64 62 2d  1]>=4 ){.    db-
2730: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29  >flags &= ~(u64)
2740: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
2750: 65 46 6d 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eFmt;.  }..  /* 
2760: 52 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  Read the schema 
2770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
2780: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 61  of the schema ta
2790: 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  bles.  */.  asse
27a0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
27b0: 79 20 29 3b 0a 20 20 7b 0a 20 20 20 20 63 68 61  y );.  {.    cha
27c0: 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 7a 53 71  r *zSql;.    zSq
27d0: 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
27e0: 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
27f0: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f  "SELECT name, ro
2800: 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d  otpage, sql FROM
2810: 20 5c 22 25 77 5c 22 2e 25 73 20 4f 52 44 45 52   \"%w\".%s ORDER
2820: 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
2830: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
2840: 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74  .zDbSName, zMast
2850: 65 72 4e 61 6d 65 29 3b 0a 23 69 66 6e 64 65 66  erName);.#ifndef
2860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2870: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 7b  HORIZATION.    {
2880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 78  .      sqlite3_x
2890: 61 75 74 68 20 78 41 75 74 68 3b 0a 20 20 20 20  auth xAuth;.    
28a0: 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
28b0: 75 74 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78  uth;.      db->x
28c0: 41 75 74 68 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Auth = 0;.#endif
28d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
28e0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
28f0: 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61  l, sqlite3InitCa
2900: 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74  llback, &initDat
2910: 61 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  a, 0);.#ifndef S
2920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
2930: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 64  RIZATION.      d
2940: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
2950: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2960: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2970: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74  E_OK ) rc = init
2980: 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 73 71 6c  Data.rc;.    sql
2990: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
29a0: 53 71 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Sql);.#ifndef SQ
29b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
29c0: 45 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  E.    if( rc==SQ
29d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29e0: 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73   sqlite3Analysis
29f0: 4c 6f 61 64 28 64 62 2c 20 69 44 62 29 3b 0a 20  Load(db, iDb);. 
2a00: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2a10: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2a20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63  Failed ){.    rc
2a30: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2a40: 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  BKPT;.    sqlite
2a50: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
2a60: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
2a70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2a80: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 64 62  SQLITE_OK || (db
2a90: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4e  ->flags&SQLITE_N
2aa0: 6f 53 63 68 65 6d 61 45 72 72 6f 72 29 29 7b 0a  oSchemaError)){.
2ab0: 20 20 20 20 2f 2a 20 42 6c 61 63 6b 20 6d 61 67      /* Black mag
2ac0: 69 63 3a 20 49 66 20 74 68 65 20 53 51 4c 49 54  ic: If the SQLIT
2ad0: 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f 72 20  E_NoSchemaError 
2ae0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
2af0: 6e 20 63 6f 6e 73 69 64 65 72 0a 20 20 20 20 2a  n consider.    *
2b00: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f 61  * the schema loa
2b10: 64 65 64 2c 20 65 76 65 6e 20 69 66 20 65 72 72  ded, even if err
2b20: 6f 72 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e  ors occurred. In
2b30: 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20   this situation 
2b40: 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72  the .    ** curr
2b50: 65 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ent sqlite3_prep
2b60: 61 72 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20  are() operation 
2b70: 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74 20 74  will fail, but t
2b80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 65  he following one
2b90: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 61 74 74  .    ** will att
2ba0: 65 6d 70 74 20 74 6f 20 63 6f 6d 70 69 6c 65 20  empt to compile 
2bb0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 74 61  the supplied sta
2bc0: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 77  tement against w
2bd0: 68 61 74 65 76 65 72 20 73 75 62 73 65 74 0a 20  hatever subset. 
2be0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68     ** of the sch
2bf0: 65 6d 61 20 77 61 73 20 6c 6f 61 64 65 64 20 62  ema was loaded b
2c00: 65 66 6f 72 65 20 74 68 65 20 65 72 72 6f 72 20  efore the error 
2c10: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 70 72  occurred. The pr
2c20: 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 70 75 72  imary.    ** pur
2c30: 70 6f 73 65 20 6f 66 20 74 68 69 73 20 69 73 20  pose of this is 
2c40: 74 6f 20 61 6c 6c 6f 77 20 61 63 63 65 73 73 20  to allow access 
2c50: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  to the sqlite_ma
2c60: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a  ster table.    *
2c70: 2a 20 65 76 65 6e 20 77 68 65 6e 20 69 74 73 20  * even when its 
2c80: 63 6f 6e 74 65 6e 74 73 20 68 61 76 65 20 62 65  contents have be
2c90: 65 6e 20 63 6f 72 72 75 70 74 65 64 2e 0a 20 20  en corrupted..  
2ca0: 20 20 2a 2f 0a 20 20 20 20 44 62 53 65 74 50 72    */.    DbSetPr
2cb0: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
2cc0: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
2cd0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2ce0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
2cf0: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 61 6e  Jump here for an
2d00: 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
2d10: 72 73 20 61 66 74 65 72 20 73 75 63 63 65 73 73  rs after success
2d20: 66 75 6c 6c 79 20 61 6c 6c 6f 63 61 74 69 6e 67  fully allocating
2d30: 0a 20 20 2a 2a 20 63 75 72 4d 61 69 6e 20 61 6e  .  ** curMain an
2d40: 64 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  d calling sqlite
2d50: 33 42 74 72 65 65 45 6e 74 65 72 28 29 2e 20 46  3BtreeEnter(). F
2d60: 6f 72 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74  or an error that
2d70: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 62 65 66   occurs.  ** bef
2d80: 6f 72 65 20 74 68 61 74 20 70 6f 69 6e 74 2c 20  ore that point, 
2d90: 6a 75 6d 70 20 74 6f 20 65 72 72 6f 72 5f 6f 75  jump to error_ou
2da0: 74 2e 0a 20 20 2a 2f 0a 69 6e 69 74 6f 6e 65 5f  t..  */.initone_
2db0: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28  error_out:.  if(
2dc0: 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69   openedTransacti
2dd0: 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  on ){.    sqlite
2de0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 44 62  3BtreeCommit(pDb
2df0: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ->pBt);.  }.  sq
2e00: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2e10: 70 44 62 2d 3e 70 42 74 29 3b 0a 0a 65 72 72 6f  pDb->pBt);..erro
2e20: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 20  r_out:.  if( rc 
2e30: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
2e40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72  QLITE_NOMEM || r
2e50: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
2e60: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
2e70: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
2e80: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
2e90: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
2ea0: 65 6d 61 28 64 62 2c 20 69 44 62 29 3b 0a 20 20  ema(db, iDb);.  
2eb0: 7d 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  }.  db->init.bus
2ec0: 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  y = 0;.  return 
2ed0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  rc;.}../*.** Ini
2ee0: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 64 61 74 61  tialize all data
2ef0: 62 61 73 65 20 66 69 6c 65 73 20 2d 20 74 68 65  base files - the
2f00: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2f10: 69 6c 65 2c 20 74 68 65 20 66 69 6c 65 0a 2a 2a  ile, the file.**
2f20: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2f30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c  emporary tables,
2f40: 20 61 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f   and any additio
2f50: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2f60: 65 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73  es.** created us
2f70: 69 6e 67 20 41 54 54 41 43 48 20 73 74 61 74 65  ing ATTACH state
2f80: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
2f90: 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 20 20   success code.  
2fa0: 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  If an.** error o
2fb0: 63 63 75 72 73 2c 20 77 72 69 74 65 20 61 6e 20  ccurs, write an 
2fc0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2fd0: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2a  to *pzErrMsg..**
2fe0: 0a 2a 2a 20 41 66 74 65 72 20 61 20 64 61 74 61  .** After a data
2ff0: 62 61 73 65 20 69 73 20 69 6e 69 74 69 61 6c 69  base is initiali
3000: 7a 65 64 2c 20 74 68 65 20 44 42 5f 53 63 68 65  zed, the DB_Sche
3010: 6d 61 4c 6f 61 64 65 64 20 62 69 74 20 69 73 20  maLoaded bit is 
3020: 73 65 74 0a 2a 2a 20 62 69 74 20 69 73 20 73 65  set.** bit is se
3030: 74 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 66  t in the flags f
3040: 69 65 6c 64 20 6f 66 20 74 68 65 20 44 62 20 73  ield of the Db s
3050: 74 72 75 63 74 75 72 65 2e 20 49 66 20 74 68 65  tructure. If the
3060: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
3070: 65 20 77 61 73 20 6f 66 20 7a 65 72 6f 2d 6c 65  e was of zero-le
3080: 6e 67 74 68 2c 20 74 68 65 6e 20 74 68 65 20 44  ngth, then the D
3090: 42 5f 45 6d 70 74 79 20 66 6c 61 67 20 69 73 20  B_Empty flag is 
30a0: 61 6c 73 6f 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74  also set..*/.int
30b0: 20 73 71 6c 69 74 65 33 49 6e 69 74 28 73 71 6c   sqlite3Init(sql
30c0: 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a  ite3 *db, char *
30d0: 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e  *pzErrMsg){.  in
30e0: 74 20 69 2c 20 72 63 3b 0a 20 20 69 6e 74 20 63  t i, rc;.  int c
30f0: 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20 3d  ommit_internal =
3100: 20 21 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 26   !(db->mDbFlags&
3110: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
3120: 6e 67 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  nge);.  .  asser
3130: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3140: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
3150: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
3160: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
3170: 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  utex(db->aDb[0].
3180: 70 42 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  pBt) );.  assert
3190: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
31a0: 3d 30 20 29 3b 0a 20 20 45 4e 43 28 64 62 29 20  =0 );.  ENC(db) 
31b0: 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29  = SCHEMA_ENC(db)
31c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
31d0: 6e 44 62 3e 30 20 29 3b 0a 20 20 2f 2a 20 44 6f  nDb>0 );.  /* Do
31e0: 20 74 68 65 20 6d 61 69 6e 20 73 63 68 65 6d 61   the main schema
31f0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 69 66 28 20   first */.  if( 
3200: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
3210: 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
3220: 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 72 63  oaded) ){.    rc
3230: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e   = sqlite3InitOn
3240: 65 28 64 62 2c 20 30 2c 20 70 7a 45 72 72 4d 73  e(db, 0, pzErrMs
3250: 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
3260: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
3270: 20 7d 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65   }.  /* All othe
3280: 72 20 73 63 68 65 6d 61 73 20 61 66 74 65 72 20  r schemas after 
3290: 74 68 65 20 6d 61 69 6e 20 73 63 68 65 6d 61 2e  the main schema.
32a0: 20 54 68 65 20 22 74 65 6d 70 22 20 73 63 68 65   The "temp" sche
32b0: 6d 61 20 6d 75 73 74 20 62 65 20 6c 61 73 74 20  ma must be last 
32c0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 64 62 2d 3e 6e  */.  for(i=db->n
32d0: 44 62 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  Db-1; i>0; i--){
32e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
32f0: 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  1 || sqlite3Btre
3300: 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e  eHoldsMutex(db->
3310: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 3b 0a 20  aDb[i].pBt) );. 
3320: 20 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f     if( !DbHasPro
3330: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
3340: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
3350: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3360: 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20 69  te3InitOne(db, i
3370: 2c 20 70 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  , pzErrMsg, 0);.
3380: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
3390: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
33a0: 20 20 7d 0a 20 20 69 66 28 20 63 6f 6d 6d 69 74    }.  if( commit
33b0: 5f 69 6e 74 65 72 6e 61 6c 20 29 7b 0a 20 20 20  _internal ){.   
33c0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
33d0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
33e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
3400: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3410: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
3420: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
3430: 6d 61 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ma is already in
3440: 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 4f 74  itialized..** Ot
3450: 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 63 68  herwise, the sch
3460: 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 2e 20 41  ema is loaded. A
3470: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
3480: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
3490: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
34a0: 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
34b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
34c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
34d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
34e0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
34f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3500: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
3510: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
3520: 62 75 73 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  busy ){.    rc =
3530: 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
3540: 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73   &pParse->zErrMs
3550: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
3560: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3570: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
3580: 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  rc;.      pParse
3590: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65  ->nErr++;.    }e
35a0: 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e 6f 53 68  lse if( db->noSh
35b0: 61 72 65 64 43 61 63 68 65 20 29 7b 0a 20 20 20  aredCache ){.   
35c0: 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
35d0: 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
35e0: 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 20 20 7d 0a 20  KnownOk;.    }. 
35f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3600: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  }.../*.** Check 
3610: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 69  schema cookies i
3620: 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2e  n all databases.
3630: 20 20 49 66 20 61 6e 79 20 63 6f 6f 6b 69 65 20    If any cookie 
3640: 69 73 20 6f 75 74 0a 2a 2a 20 6f 66 20 64 61 74  is out.** of dat
3650: 65 20 73 65 74 20 70 50 61 72 73 65 2d 3e 72 63  e set pParse->rc
3660: 20 74 6f 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   to SQLITE_SCHEM
3670: 41 2e 20 20 49 66 20 61 6c 6c 20 73 63 68 65 6d  A.  If all schem
3680: 61 20 63 6f 6f 6b 69 65 73 0a 2a 2a 20 6d 61 6b  a cookies.** mak
3690: 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  e no changes to 
36a0: 70 50 61 72 73 65 2d 3e 72 63 2e 0a 2a 2f 0a 73  pParse->rc..*/.s
36b0: 74 61 74 69 63 20 76 6f 69 64 20 73 63 68 65 6d  tatic void schem
36c0: 61 49 73 56 61 6c 69 64 28 50 61 72 73 65 20 2a  aIsValid(Parse *
36d0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
36e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
36f0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
3700: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
3710: 63 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73 73 65 72  cookie;..  asser
3720: 74 28 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b  t( pParse->check
3730: 53 63 68 65 6d 61 20 29 3b 0a 20 20 61 73 73 65  Schema );.  asse
3740: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3750: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
3760: 29 20 29 3b 0a 20 20 66 6f 72 28 69 44 62 3d 30  ) );.  for(iDb=0
3770: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
3780: 44 62 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f  Db++){.    int o
3790: 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e  penedTransaction
37a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
37b0: 20 54 72 75 65 20 69 66 20 61 20 74 72 61 6e 73   True if a trans
37c0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
37d0: 20 2a 2f 0a 20 20 20 20 42 74 72 65 65 20 2a 70   */.    Btree *p
37e0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Bt = db->aDb[iDb
37f0: 5d 2e 70 42 74 3b 20 20 20 20 20 2f 2a 20 42 74  ].pBt;     /* Bt
3800: 72 65 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ree database to 
3810: 72 65 61 64 20 63 6f 6f 6b 69 65 20 66 72 6f 6d  read cookie from
3820: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 3d   */.    if( pBt=
3830: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
3840: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
3850: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
3860: 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f 72 20 72   read-only (or r
3870: 65 61 64 2d 77 72 69 74 65 29 20 74 72 61 6e 73  ead-write) trans
3880: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 0a 20 20  action opened.  
3890: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62 2d 74 72    ** on the b-tr
38a0: 65 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70 65  ee database, ope
38b0: 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61 20  n one now. If a 
38c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
38d0: 70 65 6e 65 64 2c 20 69 74 20 0a 20 20 20 20 2a  pened, it .    *
38e0: 2a 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 64  * will be closed
38f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3900: 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 6d  er reading the m
3910: 65 74 61 2d 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  eta-value. */.  
3920: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 74    if( !sqlite3Bt
3930: 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
3940: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
3950: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
3960: 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
3970: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
3980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
3990: 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  M || rc==SQLITE_
39a0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
39b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
39c0: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
39d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
39e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
39f0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 6f 70 65 6e  turn;.      open
3a00: 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  edTransaction = 
3a10: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
3a20: 20 52 65 61 64 20 74 68 65 20 73 63 68 65 6d 61   Read the schema
3a30: 20 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65   cookie from the
3a40: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 69 74   database. If it
3a50: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
3a60: 74 68 65 20 0a 20 20 20 20 2a 2a 20 76 61 6c 75  the .    ** valu
3a70: 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
3a80: 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
3a90: 79 20 73 63 68 65 6d 61 20 72 65 70 72 65 73 65  y schema represe
3aa0: 6e 74 61 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20  ntation,.    ** 
3ab0: 73 65 74 20 50 61 72 73 65 2e 72 63 20 74 6f 20  set Parse.rc to 
3ac0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20 2a  SQLITE_SCHEMA. *
3ad0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
3ae0: 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42  eeGetMeta(pBt, B
3af0: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
3b00: 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 63 6f 6f  ION, (u32 *)&coo
3b10: 6b 69 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  kie);.    assert
3b20: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3b30: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
3b40: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
3b50: 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e 61 44 62 5b  cookie!=db->aDb[
3b60: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
3b70: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20  hema_cookie ){. 
3b80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
3b90: 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20 69  tOneSchema(db, i
3ba0: 44 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Db);.      pPars
3bb0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 53  e->rc = SQLITE_S
3bc0: 43 48 45 4d 41 3b 0a 20 20 20 20 7d 0a 0a 20 20  CHEMA;.    }..  
3bd0: 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 74    /* Close the t
3be0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 6f  ransaction, if o
3bf0: 6e 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 2a  ne was opened. *
3c00: 2f 0a 20 20 20 20 69 66 28 20 6f 70 65 6e 65 64  /.    if( opened
3c10: 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
3c20: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
3c30: 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
3c40: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3c50: 20 43 6f 6e 76 65 72 74 20 61 20 73 63 68 65 6d   Convert a schem
3c60: 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 74  a pointer into t
3c70: 68 65 20 69 44 62 20 69 6e 64 65 78 20 74 68 61  he iDb index tha
3c80: 74 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 77  t indicates.** w
3c90: 68 69 63 68 20 64 61 74 61 62 61 73 65 20 66 69  hich database fi
3ca0: 6c 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  le in db->aDb[] 
3cb0: 74 68 65 20 73 63 68 65 6d 61 20 72 65 66 65 72  the schema refer
3cc0: 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  s to..**.** If t
3cd0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
3ce0: 20 69 73 20 61 74 74 61 63 68 65 64 20 6d 6f 72   is attached mor
3cf0: 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65  e than once, the
3d00: 20 66 69 72 73 74 0a 2a 2a 20 61 74 74 61 63 68   first.** attach
3d10: 65 64 20 64 61 74 61 62 61 73 65 20 69 73 20 72  ed database is r
3d20: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
3d30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
3d40: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
3d50: 2c 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d  , Schema *pSchem
3d60: 61 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  a){.  int i = -1
3d70: 30 30 30 30 30 30 3b 0a 0a 20 20 2f 2a 20 49 66  000000;..  /* If
3d80: 20 70 53 63 68 65 6d 61 20 69 73 20 4e 55 4c 4c   pSchema is NULL
3d90: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 2d 31  , then return -1
3da0: 30 30 30 30 30 30 2e 20 54 68 69 73 20 68 61 70  000000. This hap
3db0: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 65 20 69  pens when code i
3dc0: 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e 63 20 69  n .  ** expr.c i
3dd0: 73 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73 6f  s trying to reso
3de0: 6c 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  lve a reference 
3df0: 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  to a transient t
3e00: 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e 65 0a 20  able (i.e. one. 
3e10: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
3e20: 20 73 75 62 2d 73 65 6c 65 63 74 29 2e 20 49 6e   sub-select). In
3e30: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72   this case the r
3e40: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
3e50: 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69  his .  ** functi
3e60: 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  on should never 
3e70: 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  be used..  **.  
3e80: 2a 2a 20 57 65 20 72 65 74 75 72 6e 20 2d 31 30  ** We return -10
3e90: 30 30 30 30 30 20 69 6e 73 74 65 61 64 20 6f 66  00000 instead of
3ea0: 20 74 68 65 20 6d 6f 72 65 20 75 73 75 61 6c 20   the more usual 
3eb0: 2d 31 20 73 69 6d 70 6c 79 20 62 65 63 61 75 73  -1 simply becaus
3ec0: 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20 2d 31 30  e using.  ** -10
3ed0: 30 30 30 30 30 20 61 73 20 74 68 65 20 69 6e 63  00000 as the inc
3ee0: 6f 72 72 65 63 74 20 69 6e 64 65 78 20 69 6e 74  orrect index int
3ef0: 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69 73 20 6d  o db->aDb[] is m
3f00: 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72 65 20 6c  uch .  ** more l
3f10: 69 6b 65 6c 79 20 74 6f 20 63 61 75 73 65 20 61  ikely to cause a
3f20: 20 73 65 67 66 61 75 6c 74 20 74 68 61 6e 20 2d   segfault than -
3f30: 31 20 28 6f 66 20 63 6f 75 72 73 65 20 74 68 65  1 (of course the
3f40: 72 65 20 61 72 65 20 61 73 73 65 72 74 28 29 0a  re are assert().
3f50: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
3f60: 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e 65 76 65  too, but it neve
3f70: 72 20 68 75 72 74 73 20 74 6f 20 70 6c 61 79 20  r hurts to play 
3f80: 74 68 65 20 6f 64 64 73 29 2e 0a 20 20 2a 2f 0a  the odds)..  */.
3f90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fa0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
3fb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
3fc0: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
3fd0: 66 6f 72 28 69 3d 30 3b 20 31 3b 20 69 2b 2b 29  for(i=0; 1; i++)
3fe0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3ff0: 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  i<db->nDb );.   
4000: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
4010: 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 53 63 68 65  ].pSchema==pSche
4020: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ma ){.        br
4030: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4040: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
4050: 3e 3d 30 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  >=0 && i<db->nDb
4060: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
4070: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   i;.}../*.** Fre
4080: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  e all memory all
4090: 6f 63 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  ocations in the 
40a0: 70 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a 2f  pParse object.*/
40b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 72  .void sqlite3Par
40c0: 73 65 72 52 65 73 65 74 28 50 61 72 73 65 20 2a  serReset(Parse *
40d0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
40e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
40f0: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
4100: 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
4110: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
4120: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4130: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 43  e(db, pParse->pC
4140: 6f 6e 73 74 45 78 70 72 29 3b 0a 20 20 69 66 28  onstExpr);.  if(
4150: 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
4160: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
4170: 2e 62 44 69 73 61 62 6c 65 20 3e 3d 20 70 50 61  .bDisable >= pPa
4180: 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b  rse->disableLook
4190: 61 73 69 64 65 20 29 3b 0a 20 20 20 20 64 62 2d  aside );.    db-
41a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
41b0: 62 6c 65 20 2d 3d 20 70 50 61 72 73 65 2d 3e 64  ble -= pParse->d
41c0: 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  isableLookaside;
41d0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 64  .  }.  pParse->d
41e0: 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20  isableLookaside 
41f0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 0;.}../*.** Co
4200: 6d 70 69 6c 65 20 74 68 65 20 55 54 46 2d 38 20  mpile the UTF-8 
4210: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
4220: 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f 20  ement zSql into 
4230: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
4240: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
4250: 74 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  t sqlite3Prepare
4260: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4280: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
4290: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
42a0: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
42b0: 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   /* UTF-8 encode
42c0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   */.  int nBytes
42e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
42f0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
4300: 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20  l in bytes. */. 
4310: 20 75 33 32 20 70 72 65 70 46 6c 61 67 73 2c 20   u32 prepFlags, 
4320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
4330: 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54  ro or more SQLIT
4340: 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67  E_PREPARE_* flag
4350: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70 52 65  s */.  Vdbe *pRe
4360: 70 72 65 70 61 72 65 2c 20 20 20 20 20 20 20 20  prepare,        
4370: 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65 70   /* VM being rep
4380: 72 65 70 61 72 65 64 20 2a 2f 0a 20 20 73 71 6c  repared */.  sql
4390: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
43a0: 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41  mt,    /* OUT: A
43b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
43c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
43d0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
43e0: 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20  ar **pzTail     
43f0: 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66    /* OUT: End of
4400: 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a   parsed string *
4410: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
4420: 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
4430: 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
4440: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
4450: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
4460: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
4470: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4490: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
44a0: 2f 0a 20 20 50 61 72 73 65 20 73 50 61 72 73 65  /.  Parse sParse
44b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
44c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
44d0: 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73   */..  memset(&s
44e0: 50 61 72 73 65 2c 20 30 2c 20 50 41 52 53 45 5f  Parse, 0, PARSE_
44f0: 48 44 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65  HDR_SZ);.  memse
4500: 74 28 50 41 52 53 45 5f 54 41 49 4c 28 26 73 50  t(PARSE_TAIL(&sP
4510: 61 72 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f  arse), 0, PARSE_
4520: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 50 61 72  TAIL_SZ);.  sPar
4530: 73 65 2e 70 52 65 70 72 65 70 61 72 65 20 3d 20  se.pReprepare = 
4540: 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 61 73  pReprepare;.  as
4550: 73 65 72 74 28 20 70 70 53 74 6d 74 20 26 26 20  sert( ppStmt && 
4560: 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  *ppStmt==0 );.  
4570: 2f 2a 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  /* assert( !db->
4580: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20  mallocFailed ); 
4590: 2f 2f 20 6e 6f 74 20 74 72 75 65 20 77 69 74 68  // not true with
45a0: 20 53 51 4c 49 54 45 5f 55 53 45 5f 41 4c 4c 4f   SQLITE_USE_ALLO
45b0: 43 41 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  CA */.  assert( 
45c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
45d0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
45e0: 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 6c 6f 6e  ..  /* For a lon
45f0: 67 2d 74 65 72 6d 20 75 73 65 20 70 72 65 70 61  g-term use prepa
4600: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 76  red statement av
4610: 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 0a 20  oid the use of. 
4620: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65   ** lookaside me
4630: 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mory..  */.  if(
4640: 20 70 72 65 70 46 6c 61 67 73 20 26 20 53 51 4c   prepFlags & SQL
4650: 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52 53  ITE_PREPARE_PERS
4660: 49 53 54 45 4e 54 20 29 7b 0a 20 20 20 20 73 50  ISTENT ){.    sP
4670: 61 72 73 65 2e 64 69 73 61 62 6c 65 4c 6f 6f 6b  arse.disableLook
4680: 61 73 69 64 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  aside++;.    db-
4690: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
46a0: 62 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 73 50 61  ble++;.  }.  sPa
46b0: 72 73 65 2e 64 69 73 61 62 6c 65 56 74 61 62 20  rse.disableVtab 
46c0: 3d 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  = (prepFlags & S
46d0: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4e 4f  QLITE_PREPARE_NO
46e0: 5f 56 54 41 42 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _VTAB)!=0;..  /*
46f0: 20 43 68 65 63 6b 20 74 6f 20 76 65 72 69 66 79   Check to verify
4700: 20 74 68 61 74 20 69 74 20 69 73 20 70 6f 73 73   that it is poss
4710: 69 62 6c 65 20 74 6f 20 67 65 74 20 61 20 72 65  ible to get a re
4720: 61 64 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 0a 20  ad lock on all. 
4730: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68   ** database sch
4740: 65 6d 61 73 2e 20 20 54 68 65 20 69 6e 61 62 69  emas.  The inabi
4750: 6c 69 74 79 20 74 6f 20 67 65 74 20 61 20 72 65  lity to get a re
4760: 61 64 20 6c 6f 63 6b 20 69 6e 64 69 63 61 74 65  ad lock indicate
4770: 73 20 74 68 61 74 0a 20 20 2a 2a 20 73 6f 6d 65  s that.  ** some
4780: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
4790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
47a0: 6c 64 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  lding a write-lo
47b0: 63 6b 2c 20 77 68 69 63 68 20 69 6e 0a 20 20 2a  ck, which in.  *
47c0: 2a 20 74 75 72 6e 20 6d 65 61 6e 73 20 74 68 61  * turn means tha
47d0: 74 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e 6e  t the other conn
47e0: 65 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  ection has made 
47f0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 68 61 6e  uncommitted chan
4800: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ges.  ** to the 
4810: 73 63 68 65 6d 61 2e 0a 20 20 2a 2a 0a 20 20 2a  schema..  **.  *
4820: 2a 20 57 65 72 65 20 77 65 20 74 6f 20 70 72 6f  * Were we to pro
4830: 63 65 65 64 20 61 6e 64 20 70 72 65 70 61 72 65  ceed and prepare
4840: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
4850: 67 61 69 6e 73 74 20 74 68 65 20 75 6e 63 6f 6d  gainst the uncom
4860: 6d 69 74 74 65 64 0a 20 20 2a 2a 20 73 63 68 65  mitted.  ** sche
4870: 6d 61 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  ma changes and i
4880: 66 20 74 68 6f 73 65 20 73 63 68 65 6d 61 20 63  f those schema c
4890: 68 61 6e 67 65 73 20 61 72 65 20 73 75 62 73 65  hanges are subse
48a0: 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65 64 0a 20  quently rolled. 
48b0: 20 2a 2a 20 62 61 63 6b 20 61 6e 64 20 64 69 66   ** back and dif
48c0: 66 65 72 65 6e 74 20 63 68 61 6e 67 65 73 20 61  ferent changes a
48d0: 72 65 20 6d 61 64 65 20 69 6e 20 74 68 65 69 72  re made in their
48e0: 20 70 6c 61 63 65 2c 20 74 68 65 6e 20 77 68 65   place, then whe
48f0: 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 65 70  n this.  ** prep
4900: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 67  ared statement g
4910: 6f 65 73 20 74 6f 20 72 75 6e 20 74 68 65 20 73  oes to run the s
4920: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 6f 75  chema cookie wou
4930: 6c 64 20 66 61 69 6c 20 74 6f 20 64 65 74 65 63  ld fail to detec
4940: 74 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  t.  ** the schem
4950: 61 20 63 68 61 6e 67 65 2e 20 20 44 69 73 61 73  a change.  Disas
4960: 74 65 72 20 77 6f 75 6c 64 20 66 6f 6c 6c 6f 77  ter would follow
4970: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
4980: 20 74 68 72 65 61 64 20 69 73 20 63 75 72 72 65   thread is curre
4990: 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 6d 75 74  ntly holding mut
49a0: 65 78 65 73 20 6f 6e 20 61 6c 6c 20 42 74 72 65  exes on all Btre
49b0: 65 73 20 28 62 65 63 61 75 73 65 0a 20 20 2a 2a  es (because.  **
49c0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 42   of the sqlite3B
49d0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69  treeEnterAll() i
49e0: 6e 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64  n sqlite3LockAnd
49f0: 50 72 65 70 61 72 65 28 29 29 20 73 6f 20 69 74  Prepare()) so it
4a00: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
4a10: 73 69 62 6c 65 20 66 6f 72 20 61 6e 6f 74 68 65  sible for anothe
4a20: 72 20 74 68 72 65 61 64 20 74 6f 20 73 74 61 72  r thread to star
4a30: 74 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 63  t a new schema c
4a40: 68 61 6e 67 65 0a 20 20 2a 2a 20 77 68 69 6c 65  hange.  ** while
4a50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4a60: 20 72 75 6e 6e 69 6e 67 2e 20 20 48 65 6e 63 65   running.  Hence
4a70: 2c 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  , we do not need
4a80: 20 74 6f 20 68 6f 6c 64 20 0a 20 20 2a 2a 20 6c   to hold .  ** l
4a90: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 73 63 68 65  ocks on the sche
4aa0: 6d 61 2c 20 77 65 20 6a 75 73 74 20 6e 65 65 64  ma, we just need
4ab0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f   to make sure no
4ac0: 62 6f 64 79 20 65 6c 73 65 20 69 73 20 0a 20 20  body else is .  
4ad0: 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 68 65 6d 2e  ** holding them.
4ae0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
4af0: 74 68 61 74 20 73 65 74 74 69 6e 67 20 52 45 41  that setting REA
4b00: 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 6f 76  D_UNCOMMITTED ov
4b10: 65 72 72 69 64 65 73 20 6d 6f 73 74 20 6c 6f 63  errides most loc
4b20: 6b 20 64 65 74 65 63 74 69 6f 6e 2c 0a 20 20 2a  k detection,.  *
4b30: 2a 20 62 75 74 20 69 74 20 64 6f 65 73 20 2a 6e  * but it does *n
4b40: 6f 74 2a 20 6f 76 65 72 72 69 64 65 20 73 63 68  ot* override sch
4b50: 65 6d 61 20 6c 6f 63 6b 20 64 65 74 65 63 74 69  ema lock detecti
4b60: 6f 6e 2c 20 73 6f 20 74 68 69 73 20 61 6c 6c 20  on, so this all 
4b70: 73 74 69 6c 6c 0a 20 20 2a 2a 20 77 6f 72 6b 73  still.  ** works
4b80: 20 65 76 65 6e 20 69 66 20 52 45 41 44 5f 55 4e   even if READ_UN
4b90: 43 4f 4d 4d 49 54 54 45 44 20 69 73 20 73 65 74  COMMITTED is set
4ba0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
4bb0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
4bc0: 29 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ) {.    Btree *p
4bd0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
4be0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
4bf0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
4c00: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4c10: 6c 64 73 4d 75 74 65 78 28 70 42 74 29 20 29 3b  ldsMutex(pBt) );
4c20: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4c30: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f  te3BtreeSchemaLo
4c40: 63 6b 65 64 28 70 42 74 29 3b 0a 20 20 20 20 20  cked(pBt);.     
4c50: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
4c60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4c70: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Db = db->aDb[i].
4c80: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
4c90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
4ca0: 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 22 64  thMsg(db, rc, "d
4cb0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
4cc0: 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a  s locked: %s", z
4cd0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Db);.        tes
4ce0: 74 63 61 73 65 28 20 64 62 2d 3e 66 6c 61 67 73  tcase( db->flags
4cf0: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
4d00: 63 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  commit );.      
4d10: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70 61    goto end_prepa
4d20: 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
4d30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
4d40: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
4d50: 62 29 3b 0a 0a 20 20 73 50 61 72 73 65 2e 64 62  b);..  sParse.db
4d60: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 6e 42 79   = db;.  if( nBy
4d70: 74 65 73 3e 3d 30 20 26 26 20 28 6e 42 79 74 65  tes>=0 && (nByte
4d80: 73 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 42 79  s==0 || zSql[nBy
4d90: 74 65 73 2d 31 5d 21 3d 30 29 20 29 7b 0a 20 20  tes-1]!=0) ){.  
4da0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 43 6f 70 79    char *zSqlCopy
4db0: 3b 0a 20 20 20 20 69 6e 74 20 6d 78 4c 65 6e 20  ;.    int mxLen 
4dc0: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  = db->aLimit[SQL
4dd0: 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
4de0: 4e 47 54 48 5d 3b 0a 20 20 20 20 74 65 73 74 63  NGTH];.    testc
4df0: 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78 4c  ase( nBytes==mxL
4e00: 65 6e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  en );.    testca
4e10: 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78 4c 65  se( nBytes==mxLe
4e20: 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  n+1 );.    if( n
4e30: 42 79 74 65 73 3e 6d 78 4c 65 6e 20 29 7b 0a 20  Bytes>mxLen ){. 
4e40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4e50: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
4e60: 49 54 45 5f 54 4f 4f 42 49 47 2c 20 22 73 74 61  ITE_TOOBIG, "sta
4e70: 74 65 6d 65 6e 74 20 74 6f 6f 20 6c 6f 6e 67 22  tement too long"
4e80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
4e90: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
4ea0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 29 3b   SQLITE_TOOBIG);
4eb0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
4ec0: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 7d 0a 20  prepare;.    }. 
4ed0: 20 20 20 7a 53 71 6c 43 6f 70 79 20 3d 20 73 71     zSqlCopy = sq
4ee0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
4ef0: 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 29  b, zSql, nBytes)
4f00: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 43 6f  ;.    if( zSqlCo
4f10: 70 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  py ){.      sqli
4f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 26 73 50  te3RunParser(&sP
4f30: 61 72 73 65 2c 20 7a 53 71 6c 43 6f 70 79 2c 20  arse, zSqlCopy, 
4f40: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
4f50: 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 20 3d 20   sParse.zTail = 
4f60: 26 7a 53 71 6c 5b 73 50 61 72 73 65 2e 7a 54 61  &zSql[sParse.zTa
4f70: 69 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b 0a 20 20  il-zSqlCopy];.  
4f80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4f90: 65 28 64 62 2c 20 7a 53 71 6c 43 6f 70 79 29 3b  e(db, zSqlCopy);
4fa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4fb0: 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 20 3d    sParse.zTail =
4fc0: 20 26 7a 53 71 6c 5b 6e 42 79 74 65 73 5d 3b 0a   &zSql[nBytes];.
4fd0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4fe0: 20 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72     sqlite3RunPar
4ff0: 73 65 72 28 26 73 50 61 72 73 65 2c 20 7a 53 71  ser(&sParse, zSq
5000: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
5010: 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  }.  assert( 0==s
5020: 50 61 72 73 65 2e 6e 51 75 65 72 79 4c 6f 6f 70  Parse.nQueryLoop
5030: 20 29 3b 0a 0a 20 20 69 66 28 20 73 50 61 72 73   );..  if( sPars
5040: 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  e.rc==SQLITE_DON
5050: 45 20 29 20 73 50 61 72 73 65 2e 72 63 20 3d 20  E ) sParse.rc = 
5060: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5070: 20 73 50 61 72 73 65 2e 63 68 65 63 6b 53 63 68   sParse.checkSch
5080: 65 6d 61 20 29 7b 0a 20 20 20 20 73 63 68 65 6d  ema ){.    schem
5090: 61 49 73 56 61 6c 69 64 28 26 73 50 61 72 73 65  aIsValid(&sParse
50a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  );.  }.  if( db-
50b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
50c0: 0a 20 20 20 20 73 50 61 72 73 65 2e 72 63 20 3d  .    sParse.rc =
50d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
50e0: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 7a  PT;.  }.  if( pz
50f0: 54 61 69 6c 20 29 7b 0a 20 20 20 20 2a 70 7a 54  Tail ){.    *pzT
5100: 61 69 6c 20 3d 20 73 50 61 72 73 65 2e 7a 54 61  ail = sParse.zTa
5110: 69 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  il;.  }.  rc = s
5120: 50 61 72 73 65 2e 72 63 3b 0a 0a 23 69 66 6e 64  Parse.rc;..#ifnd
5130: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
5140: 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 72 63 3d  XPLAIN.  if( rc=
5150: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 50  =SQLITE_OK && sP
5160: 61 72 73 65 2e 70 56 64 62 65 20 26 26 20 73 50  arse.pVdbe && sP
5170: 61 72 73 65 2e 65 78 70 6c 61 69 6e 20 29 7b 0a  arse.explain ){.
5180: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5190: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
51a0: 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  ColName[] = {.  
51b0: 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
51c0: 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
51d0: 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
51e0: 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 2c 0a  p5", "comment",.
51f0: 20 20 20 20 20 20 20 22 69 64 22 2c 20 22 70 61         "id", "pa
5200: 72 65 6e 74 22 2c 20 22 6e 6f 74 75 73 65 64 22  rent", "notused"
5210: 2c 20 22 64 65 74 61 69 6c 22 0a 20 20 20 20 7d  , "detail".    }
5220: 3b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73 74  ;.    int iFirst
5230: 2c 20 6d 78 3b 0a 20 20 20 20 69 66 28 20 73 50  , mx;.    if( sP
5240: 61 72 73 65 2e 65 78 70 6c 61 69 6e 3d 3d 32 20  arse.explain==2 
5250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5260: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 73  VdbeSetNumCols(s
5270: 50 61 72 73 65 2e 70 56 64 62 65 2c 20 34 29 3b  Parse.pVdbe, 4);
5280: 0a 20 20 20 20 20 20 69 46 69 72 73 74 20 3d 20  .      iFirst = 
5290: 38 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20 31 32  8;.      mx = 12
52a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
52b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
52c0: 74 4e 75 6d 43 6f 6c 73 28 73 50 61 72 73 65 2e  tNumCols(sParse.
52d0: 70 56 64 62 65 2c 20 38 29 3b 0a 20 20 20 20 20  pVdbe, 8);.     
52e0: 20 69 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20   iFirst = 0;.   
52f0: 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20 20 20 7d     mx = 8;.    }
5300: 0a 20 20 20 20 66 6f 72 28 69 3d 69 46 69 72 73  .    for(i=iFirs
5310: 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  t; i<mx; i++){. 
5320: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5330: 53 65 74 43 6f 6c 4e 61 6d 65 28 73 50 61 72 73  SetColName(sPars
5340: 65 2e 70 56 64 62 65 2c 20 69 2d 69 46 69 72 73  e.pVdbe, i-iFirs
5350: 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  t, COLNAME_NAME,
5360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43               azC
5380: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c 49 54  olName[i], SQLIT
5390: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
53a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
53b0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
53c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
53d0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 73 50 61  e3VdbeSetSql(sPa
53e0: 72 73 65 2e 70 56 64 62 65 2c 20 7a 53 71 6c 2c  rse.pVdbe, zSql,
53f0: 20 28 69 6e 74 29 28 73 50 61 72 73 65 2e 7a 54   (int)(sParse.zT
5400: 61 69 6c 2d 7a 53 71 6c 29 2c 20 70 72 65 70 46  ail-zSql), prepF
5410: 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
5420: 20 73 50 61 72 73 65 2e 70 56 64 62 65 20 26 26   sParse.pVdbe &&
5430: 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc!=SQLITE_OK 
5440: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
5450: 6c 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  led) ){.    sqli
5460: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
5470: 73 50 61 72 73 65 2e 70 56 64 62 65 29 3b 0a 20  sParse.pVdbe);. 
5480: 20 20 20 61 73 73 65 72 74 28 21 28 2a 70 70 53     assert(!(*ppS
5490: 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tmt));.  }else{.
54a0: 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 28 73      *ppStmt = (s
54b0: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 50 61  qlite3_stmt*)sPa
54c0: 72 73 65 2e 70 56 64 62 65 3b 0a 20 20 7d 0a 0a  rse.pVdbe;.  }..
54d0: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
54e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
54f0: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
5500: 20 22 25 73 22 2c 20 7a 45 72 72 4d 73 67 29 3b   "%s", zErrMsg);
5510: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5520: 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
5530: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
5540: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
5550: 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  c);.  }..  /* De
5560: 6c 65 74 65 20 61 6e 79 20 54 72 69 67 67 65 72  lete any Trigger
5570: 50 72 67 20 73 74 72 75 63 74 75 72 65 73 20 61  Prg structures a
5580: 6c 6c 6f 63 61 74 65 64 20 77 68 69 6c 65 20 70  llocated while p
5590: 61 72 73 69 6e 67 20 74 68 69 73 20 73 74 61 74  arsing this stat
55a0: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 77 68 69 6c  ement. */.  whil
55b0: 65 28 20 73 50 61 72 73 65 2e 70 54 72 69 67 67  e( sParse.pTrigg
55c0: 65 72 50 72 67 20 29 7b 0a 20 20 20 20 54 72 69  erPrg ){.    Tri
55d0: 67 67 65 72 50 72 67 20 2a 70 54 20 3d 20 73 50  ggerPrg *pT = sP
55e0: 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72 67  arse.pTriggerPrg
55f0: 3b 0a 20 20 20 20 73 50 61 72 73 65 2e 70 54 72  ;.    sParse.pTr
5600: 69 67 67 65 72 50 72 67 20 3d 20 70 54 2d 3e 70  iggerPrg = pT->p
5610: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
5620: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 29 3b  3DbFree(db, pT);
5630: 0a 20 20 7d 0a 0a 65 6e 64 5f 70 72 65 70 61 72  .  }..end_prepar
5640: 65 3a 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 72  e:..  sqlite3Par
5650: 73 65 72 52 65 73 65 74 28 26 73 50 61 72 73 65  serReset(&sParse
5660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5670: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  }.static int sql
5680: 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61  ite3LockAndPrepa
5690: 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
56a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
56b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
56c0: 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  le. */.  const c
56d0: 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
56e0: 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f     /* UTF-8 enco
56f0: 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ded SQL statemen
5700: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  t. */.  int nByt
5710: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  es,             
5720: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
5730: 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f  Sql in bytes. */
5740: 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67 73  .  u32 prepFlags
5750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5760: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c  Zero or more SQL
5770: 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c  ITE_PREPARE_* fl
5780: 61 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70  ags */.  Vdbe *p
5790: 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
57a0: 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72     /* VM being r
57b0: 65 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20 73  eprepared */.  s
57c0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
57d0: 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt,    /* OUT:
57e0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
57f0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
5800: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
5810: 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20  char **pzTail   
5820: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20      /* OUT: End 
5830: 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67  of parsed string
5840: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
5850: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
5860: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5870: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
5880: 20 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30 20    if( ppStmt==0 
5890: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
58a0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
58b0: 64 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  dif.  *ppStmt = 
58c0: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
58d0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
58e0: 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  b)||zSql==0 ){. 
58f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5900: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
5910: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
5920: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
5930: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
5940: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
5950: 20 20 64 6f 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b    do{.    /* Mak
5960: 65 20 6d 75 6c 74 69 70 6c 65 20 61 74 74 65 6d  e multiple attem
5970: 70 74 73 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74  pts to compile t
5980: 68 65 20 53 51 4c 2c 20 75 6e 74 69 6c 20 69 74  he SQL, until it
5990: 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73   either succeeds
59a0: 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6e 63 6f 75  .    ** or encou
59b0: 6e 74 65 72 73 20 61 20 70 65 72 6d 61 6e 65 6e  nters a permanen
59c0: 74 20 65 72 72 6f 72 2e 20 20 41 20 73 63 68 65  t error.  A sche
59d0: 6d 61 20 70 72 6f 62 6c 65 6d 20 61 66 74 65 72  ma problem after
59e0: 20 6f 6e 65 20 73 63 68 65 6d 61 0a 20 20 20 20   one schema.    
59f0: 2a 2a 20 72 65 73 65 74 20 69 73 20 63 6f 6e 73  ** reset is cons
5a00: 69 64 65 72 65 64 20 61 20 70 65 72 6d 61 6e 65  idered a permane
5a10: 6e 74 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  nt error. */.   
5a20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65   rc = sqlite3Pre
5a30: 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 6e  pare(db, zSql, n
5a40: 42 79 74 65 73 2c 20 70 72 65 70 46 6c 61 67 73  Bytes, prepFlags
5a50: 2c 20 70 4f 6c 64 2c 20 70 70 53 74 6d 74 2c 20  , pOld, ppStmt, 
5a60: 70 7a 54 61 69 6c 29 3b 0a 20 20 20 20 61 73 73  pzTail);.    ass
5a70: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
5a80: 4f 4b 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30  OK || *ppStmt==0
5a90: 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   );.  }while( rc
5aa0: 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52  ==SQLITE_ERROR_R
5ab0: 45 54 52 59 0a 20 20 20 20 20 20 20 7c 7c 20 28  ETRY.       || (
5ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  rc==SQLITE_SCHEM
5ad0: 41 20 26 26 20 28 73 71 6c 69 74 65 33 52 65 73  A && (sqlite3Res
5ae0: 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 2d  etOneSchema(db,-
5af0: 31 29 2c 20 63 6e 74 2b 2b 29 3d 3d 30 29 20 29  1), cnt++)==0) )
5b00: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
5b10: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
5b20: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
5b30: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 61  xit(db, rc);.  a
5b40: 73 73 65 72 74 28 20 28 72 63 26 64 62 2d 3e 65  ssert( (rc&db->e
5b50: 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
5b60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5b70: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5b80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5b90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 72 75 6e 20 74 68  ../*.** Rerun th
5ba0: 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  e compilation of
5bb0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74   a statement aft
5bc0: 65 72 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e  er a schema chan
5bd0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
5be0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75   statement is su
5bf0: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 63 6f 6d  ccessfully recom
5c00: 70 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 53 51  piled, return SQ
5c10: 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
5c20: 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 73 74  se,.** if the st
5c30: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 62  atement cannot b
5c40: 65 20 72 65 63 6f 6d 70 69 6c 65 64 20 62 65 63  e recompiled bec
5c50: 61 75 73 65 20 61 6e 6f 74 68 65 72 20 63 6f 6e  ause another con
5c60: 6e 65 63 74 69 6f 6e 20 68 61 73 0a 2a 2a 20 6c  nection has.** l
5c70: 6f 63 6b 65 64 20 74 68 65 20 73 71 6c 69 74 65  ocked the sqlite
5c80: 33 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20  3_master table, 
5c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
5ca0: 43 4b 45 44 2e 20 49 66 20 61 6e 79 20 6f 74 68  CKED. If any oth
5cb0: 65 72 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  er error.** occu
5cc0: 72 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  rs, return SQLIT
5cd0: 45 5f 53 43 48 45 4d 41 2e 0a 2a 2f 0a 69 6e 74  E_SCHEMA..*/.int
5ce0: 20 73 71 6c 69 74 65 33 52 65 70 72 65 70 61 72   sqlite3Reprepar
5cf0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
5d00: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
5d10: 73 74 6d 74 20 2a 70 4e 65 77 3b 0a 20 20 63 6f  stmt *pNew;.  co
5d20: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
5d30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
5d40: 20 75 38 20 70 72 65 70 46 6c 61 67 73 3b 0a 0a   u8 prepFlags;..
5d50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d60: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
5d70: 69 74 65 33 56 64 62 65 44 62 28 70 29 2d 3e 6d  ite3VdbeDb(p)->m
5d80: 75 74 65 78 29 20 29 3b 0a 20 20 7a 53 71 6c 20  utex) );.  zSql 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 28 73  = sqlite3_sql((s
5da0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 29  qlite3_stmt *)p)
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 71 6c  ;.  assert( zSql
5dc0: 21 3d 30 20 29 3b 20 20 2f 2a 20 52 65 70 72 65  !=0 );  /* Repre
5dd0: 70 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  pare only called
5de0: 20 66 6f 72 20 70 72 65 70 61 72 65 5f 76 32 28   for prepare_v2(
5df0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
5e00: 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 56 64    db = sqlite3Vd
5e10: 62 65 44 62 28 70 29 3b 0a 20 20 61 73 73 65 72  beDb(p);.  asser
5e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5e30: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
5e40: 20 29 3b 0a 20 20 70 72 65 70 46 6c 61 67 73 20   );.  prepFlags 
5e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  = sqlite3VdbePre
5e60: 70 61 72 65 46 6c 61 67 73 28 70 29 3b 0a 20 20  pareFlags(p);.  
5e70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b  rc = sqlite3Lock
5e80: 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 20 7a  AndPrepare(db, z
5e90: 53 71 6c 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61  Sql, -1, prepFla
5ea0: 67 73 2c 20 70 2c 20 26 70 4e 65 77 2c 20 30 29  gs, p, &pNew, 0)
5eb0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
5ec0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5ed0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
5ee0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
5ef0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  db);.    }.    a
5f00: 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 29  ssert( pNew==0 )
5f10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
5f20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5f30: 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
5f40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
5f50: 62 65 53 77 61 70 28 28 56 64 62 65 2a 29 70 4e  beSwap((Vdbe*)pN
5f60: 65 77 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  ew, p);.  sqlite
5f70: 33 54 72 61 6e 73 66 65 72 42 69 6e 64 69 6e 67  3TransferBinding
5f80: 73 28 70 4e 65 77 2c 20 28 73 71 6c 69 74 65 33  s(pNew, (sqlite3
5f90: 5f 73 74 6d 74 2a 29 70 29 3b 0a 20 20 73 71 6c  _stmt*)p);.  sql
5fa0: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
5fb0: 70 52 65 73 75 6c 74 28 28 56 64 62 65 2a 29 70  pResult((Vdbe*)p
5fc0: 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  New);.  sqlite3V
5fd0: 64 62 65 46 69 6e 61 6c 69 7a 65 28 28 56 64 62  dbeFinalize((Vdb
5fe0: 65 2a 29 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e*)pNew);.  retu
5ff0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6000: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 65 72 73  ../*.** Two vers
6010: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6f 66 66 69  ions of the offi
6020: 63 69 61 6c 20 41 50 49 2e 20 20 4c 65 67 61 63  cial API.  Legac
6030: 79 20 61 6e 64 20 6e 65 77 20 75 73 65 2e 20 20  y and new use.  
6040: 49 6e 20 74 68 65 20 6c 65 67 61 63 79 0a 2a 2a  In the legacy.**
6050: 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72   version, the or
6060: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
6070: 69 73 20 6e 6f 74 20 73 61 76 65 64 20 69 6e 20  is not saved in 
6080: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
6090: 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 73 6f  tement.** and so
60a0: 20 69 66 20 61 20 73 63 68 65 6d 61 20 63 68 61   if a schema cha
60b0: 6e 67 65 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  nge occurs, SQLI
60c0: 54 45 5f 53 43 48 45 4d 41 20 69 73 20 72 65 74  TE_SCHEMA is ret
60d0: 75 72 6e 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69  urned by.** sqli
60e0: 74 65 33 5f 73 74 65 70 28 29 2e 20 20 49 6e 20  te3_step().  In 
60f0: 74 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 2c  the new version,
6100: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
6110: 4c 20 74 65 78 74 20 69 73 20 72 65 74 61 69 6e  L text is retain
6120: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 74  ed.** and the st
6130: 61 74 65 6d 65 6e 74 20 69 73 20 61 75 74 6f 6d  atement is autom
6140: 61 74 69 63 61 6c 6c 79 20 72 65 63 6f 6d 70 69  atically recompi
6150: 6c 65 64 20 69 66 20 61 6e 20 73 63 68 65 6d 61  led if an schema
6160: 20 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75 72   change.** occur
6170: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
6180: 33 5f 70 72 65 70 61 72 65 28 0a 20 20 73 71 6c  3_prepare(.  sql
6190: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
61a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
61b0: 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20  se handle. */.  
61c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
61d0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46  ,         /* UTF
61e0: 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  -8 encoded SQL s
61f0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
6200: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
6210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
6220: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
6230: 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tes. */.  sqlite
6240: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
6250: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
6260: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
6270: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
6280: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6290: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
62a0: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
62b0: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
62c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
62d0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e   = sqlite3LockAn
62e0: 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c  dPrepare(db,zSql
62f0: 2c 6e 42 79 74 65 73 2c 30 2c 30 2c 70 70 53 74  ,nBytes,0,0,ppSt
6300: 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73  mt,pzTail);.  as
6310: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
6320: 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30  _OK || ppStmt==0
6330: 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29   || *ppStmt==0 )
6340: 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31  ;  /* VERIFY: F1
6350: 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  3021 */.  return
6360: 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
6370: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20  e3_prepare_v2(. 
6380: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
63a0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
63b0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
63c0: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  zSql,         /*
63d0: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53   UTF-8 encoded S
63e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  QL statement. */
63f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20  .  int nBytes,  
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6410: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
6420: 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71  n bytes. */.  sq
6430: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
6440: 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20  tmt,    /* OUT: 
6450: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
6460: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
6470: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
6480: 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20  har **pzTail    
6490: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f     /* OUT: End o
64a0: 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20  f parsed string 
64b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
64c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
64d0: 3a 20 52 2d 33 37 39 32 33 2d 31 32 31 37 33 20  : R-37923-12173 
64e0: 54 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  The sqlite3_prep
64f0: 61 72 65 5f 76 32 28 29 20 69 6e 74 65 72 66 61  are_v2() interfa
6500: 63 65 20 77 6f 72 6b 73 0a 20 20 2a 2a 20 65 78  ce works.  ** ex
6510: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
6520: 73 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  s sqlite3_prepar
6530: 65 5f 76 33 28 29 20 77 69 74 68 20 61 20 7a 65  e_v3() with a ze
6540: 72 6f 20 70 72 65 70 46 6c 61 67 73 0a 20 20 2a  ro prepFlags.  *
6550: 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  * parameter..  *
6560: 2a 0a 20 20 2a 2a 20 50 72 6f 6f 66 20 69 6e 20  *.  ** Proof in 
6570: 74 68 61 74 20 74 68 65 20 35 74 68 20 70 61 72  that the 5th par
6580: 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ameter to sqlite
6590: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 20  3LockAndPrepare 
65a0: 69 73 20 30 20 2a 2f 0a 20 20 72 63 20 3d 20 73  is 0 */.  rc = s
65b0: 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65  qlite3LockAndPre
65c0: 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79  pare(db,zSql,nBy
65d0: 74 65 73 2c 53 51 4c 49 54 45 5f 50 52 45 50 41  tes,SQLITE_PREPA
65e0: 52 45 5f 53 41 56 45 53 51 4c 2c 30 2c 0a 20 20  RE_SAVESQL,0,.  
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 20 20 20 20 70 70 53 74 6d             ppStm
6610: 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73  t,pzTail);.  ass
6620: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
6630: 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20  OK || ppStmt==0 
6640: 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b  || *ppStmt==0 );
6650: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6660: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70  int sqlite3_prep
6670: 61 72 65 5f 76 33 28 0a 20 20 73 71 6c 69 74 65  are_v3(.  sqlite
6680: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6690: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
66a0: 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e  handle. */.  con
66b0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
66c0: 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20         /* UTF-8 
66d0: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
66e0: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  ement. */.  int 
66f0: 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20  nBytes,         
6700: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6710: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
6720: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
6730: 69 6e 74 20 70 72 65 70 46 6c 61 67 73 2c 20 20  int prepFlags,  
6740: 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
6750: 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f   SQLITE_PREPARE_
6760: 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  * flags */.  sql
6770: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
6780: 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41  mt,    /* OUT: A
6790: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
67a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
67b0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
67c0: 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20  ar **pzTail     
67d0: 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66    /* OUT: End of
67e0: 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a   parsed string *
67f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
6800: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
6810: 20 52 2d 35 36 38 36 31 2d 34 32 36 37 33 20 73   R-56861-42673 s
6820: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6830: 33 28 29 20 64 69 66 66 65 72 73 20 66 72 6f 6d  3() differs from
6840: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  .  ** sqlite3_pr
6850: 65 70 61 72 65 5f 76 32 28 29 20 6f 6e 6c 79 20  epare_v2() only 
6860: 69 6e 20 68 61 76 69 6e 67 20 74 68 65 20 65 78  in having the ex
6870: 74 72 61 20 70 72 65 70 46 6c 61 67 73 20 70 61  tra prepFlags pa
6880: 72 61 6d 65 74 65 72 2c 0a 20 20 2a 2a 20 77 68  rameter,.  ** wh
6890: 69 63 68 20 69 73 20 61 20 62 69 74 20 61 72 72  ich is a bit arr
68a0: 61 79 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ay consisting of
68b0: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 66   zero or more of
68c0: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
68d0: 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73  _PREPARE_* flags
68e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 6f 6f  ..  **.  ** Proo
68f0: 66 20 62 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  f by comparison 
6900: 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
6910: 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
6920: 5f 70 72 65 70 61 72 65 5f 76 32 28 29 0a 20 20  _prepare_v2().  
6930: 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 62 6f 76  ** directly abov
6940: 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e. */.  rc = sql
6950: 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61  ite3LockAndPrepa
6960: 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  re(db,zSql,nByte
6970: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
6980: 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45 50 41      SQLITE_PREPA
6990: 52 45 5f 53 41 56 45 53 51 4c 7c 28 70 72 65 70  RE_SAVESQL|(prep
69a0: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 50 52 45  Flags&SQLITE_PRE
69b0: 50 41 52 45 5f 4d 41 53 4b 29 2c 0a 20 20 20 20  PARE_MASK),.    
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 70               0,p
69d0: 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20  pStmt,pzTail);. 
69e0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
69f0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74  ITE_OK || ppStmt
6a00: 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d  ==0 || *ppStmt==
6a10: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
6a20: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
6a30: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6a40: 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74 68  /*.** Compile th
6a50: 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  e UTF-16 encoded
6a60: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a   SQL statement z
6a70: 53 71 6c 20 69 6e 74 6f 20 61 20 73 74 61 74 65  Sql into a state
6a80: 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
6a90: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
6aa0: 65 33 50 72 65 70 61 72 65 31 36 28 0a 20 20 73  e3Prepare16(.  s
6ab0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6ad0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20  base handle. */ 
6ae0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
6af0: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql,         /* 
6b00: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53  UTF-16 encoded S
6b10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  QL statement. */
6b20: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20  .  int nBytes,  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b40: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
6b50: 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 33  n bytes. */.  u3
6b60: 32 20 70 72 65 70 46 6c 61 67 73 2c 20 20 20 20  2 prepFlags,    
6b70: 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
6b80: 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50  or more SQLITE_P
6b90: 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a  REPARE_* flags *
6ba0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
6bb0: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
6bc0: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
6bd0: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
6be0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
6bf0: 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61  onst void **pzTa
6c00: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
6c10: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
6c20: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  tring */.){.  /*
6c30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
6c40: 75 72 72 65 6e 74 6c 79 20 77 6f 72 6b 73 20 62  urrently works b
6c50: 79 20 66 69 72 73 74 20 74 72 61 6e 73 66 6f 72  y first transfor
6c60: 6d 69 6e 67 20 74 68 65 20 55 54 46 2d 31 36 0a  ming the UTF-16.
6c70: 20 20 2a 2a 20 65 6e 63 6f 64 65 64 20 73 74 72    ** encoded str
6c80: 69 6e 67 20 74 6f 20 55 54 46 2d 38 2c 20 74 68  ing to UTF-8, th
6c90: 65 6e 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69  en invoking sqli
6ca0: 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e 20 54  te3_prepare(). T
6cb0: 68 65 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20 62  he.  ** tricky b
6cc0: 69 74 20 69 73 20 66 69 67 75 72 69 6e 67 20 6f  it is figuring o
6cd0: 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  ut the pointer t
6ce0: 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70 7a 54  o return in *pzT
6cf0: 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  ail..  */.  char
6d00: 20 2a 7a 53 71 6c 38 3b 0a 20 20 63 6f 6e 73 74   *zSql8;.  const
6d10: 20 63 68 61 72 20 2a 7a 54 61 69 6c 38 20 3d 20   char *zTail8 = 
6d20: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
6d30: 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
6d40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
6d50: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
6d60: 70 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  pStmt==0 ) retur
6d70: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
6d80: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
6d90: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
6da0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
6db0: 43 68 65 63 6b 4f 6b 28 64 62 29 7c 7c 7a 53 71  CheckOk(db)||zSq
6dc0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  l==0 ){.    retu
6dd0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
6de0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
6df0: 20 6e 42 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20   nBytes>=0 ){.  
6e00: 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 63 6f    int sz;.    co
6e10: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
6e20: 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 3b  onst char*)zSql;
6e30: 0a 20 20 20 20 66 6f 72 28 73 7a 3d 30 3b 20 73  .    for(sz=0; s
6e40: 7a 3c 6e 42 79 74 65 73 20 26 26 20 28 7a 5b 73  z<nBytes && (z[s
6e50: 7a 5d 21 3d 30 20 7c 7c 20 7a 5b 73 7a 2b 31 5d  z]!=0 || z[sz+1]
6e60: 21 3d 30 29 3b 20 73 7a 20 2b 3d 20 32 29 7b 7d  !=0); sz += 2){}
6e70: 0a 20 20 20 20 6e 42 79 74 65 73 20 3d 20 73 7a  .    nBytes = sz
6e80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6e90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
6ea0: 6d 75 74 65 78 29 3b 0a 20 20 7a 53 71 6c 38 20  mutex);.  zSql8 
6eb0: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
6ec0: 38 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74  8(db, zSql, nByt
6ed0: 65 73 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  es, SQLITE_UTF16
6ee0: 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a  NATIVE);.  if( z
6ef0: 53 71 6c 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sql8 ){.    rc =
6f00: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50   sqlite3LockAndP
6f10: 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 38  repare(db, zSql8
6f20: 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67 73 2c  , -1, prepFlags,
6f30: 20 30 2c 20 70 70 53 74 6d 74 2c 20 26 7a 54 61   0, ppStmt, &zTa
6f40: 69 6c 38 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  il8);.  }..  if(
6f50: 20 7a 54 61 69 6c 38 20 26 26 20 70 7a 54 61 69   zTail8 && pzTai
6f60: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  l ){.    /* If s
6f70: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 72  qlite3_prepare r
6f80: 65 74 75 72 6e 73 20 61 20 74 61 69 6c 20 70 6f  eturns a tail po
6f90: 69 6e 74 65 72 2c 20 77 65 20 63 61 6c 63 75 6c  inter, we calcul
6fa0: 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  ate the.    ** e
6fb0: 71 75 69 76 61 6c 65 6e 74 20 70 6f 69 6e 74 65  quivalent pointe
6fc0: 72 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31  r into the UTF-1
6fd0: 36 20 73 74 72 69 6e 67 20 62 79 20 63 6f 75 6e  6 string by coun
6fe0: 74 69 6e 67 20 74 68 65 20 75 6e 69 63 6f 64 65  ting the unicode
6ff0: 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65  .    ** characte
7000: 72 73 20 62 65 74 77 65 65 6e 20 7a 53 71 6c 38  rs between zSql8
7010: 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20 61 6e 64   and zTail8, and
7020: 20 74 68 65 6e 20 72 65 74 75 72 6e 69 6e 67 20   then returning 
7030: 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a  a pointer.    **
7040: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
7050: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
7060: 6e 74 6f 20 74 68 65 20 55 54 46 2d 31 36 20 73  nto the UTF-16 s
7070: 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tring..    */.  
7080: 20 20 69 6e 74 20 63 68 61 72 73 5f 70 61 72 73    int chars_pars
7090: 65 64 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  ed = sqlite3Utf8
70a0: 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38 2c 20 28  CharLen(zSql8, (
70b0: 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a 53 71 6c  int)(zTail8-zSql
70c0: 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54 61 69 6c  8));.    *pzTail
70d0: 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c 20 2b 20   = (u8 *)zSql + 
70e0: 73 71 6c 69 74 65 33 55 74 66 31 36 42 79 74 65  sqlite3Utf16Byte
70f0: 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61 72 73 5f  Len(zSql, chars_
7100: 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a 20 20 73  parsed);.  }.  s
7110: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7120: 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72 63 20 3d   zSql8); .  rc =
7130: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
7140: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
7150: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7160: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
7170: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7180: 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   Two versions of
7190: 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20 41 50   the official AP
71a0: 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64 20 6e  I.  Legacy and n
71b0: 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68 65 20  ew use.  In the 
71c0: 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73 69 6f  legacy.** versio
71d0: 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  n, the original 
71e0: 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f 74 20  SQL text is not 
71f0: 73 61 76 65 64 20 69 6e 20 74 68 65 20 70 72 65  saved in the pre
7200: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
7210: 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61 20 73  ** and so if a s
7220: 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f 63 63  chema change occ
7230: 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43 48 45  urs, SQLITE_SCHE
7240: 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  MA is returned b
7250: 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 65  y.** sqlite3_ste
7260: 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e 65 77  p().  In the new
7270: 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72   version, the or
7280: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
7290: 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a 20 61  is retained.** a
72a0: 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  nd the statement
72b0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
72c0: 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69 66 20  y recompiled if 
72d0: 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  an schema change
72e0: 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
72f0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  nt sqlite3_prepa
7300: 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  re16(.  sqlite3 
7310: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
7320: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
7330: 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73  ndle. */ .  cons
7340: 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20 20 20  t void *zSql,   
7350: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20        /* UTF-16 
7360: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
7370: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  ement. */.  int 
7380: 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20  nBytes,         
7390: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
73a0: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
73b0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
73c0: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
73d0: 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74   /* OUT: A point
73e0: 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  er to the prepar
73f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
7400: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70    const void **p
7410: 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f  zTail       /* O
7420: 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65  UT: End of parse
7430: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
7440: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
7450: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36  sqlite3Prepare16
7460: 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c  (db,zSql,nBytes,
7470: 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29  0,ppStmt,pzTail)
7480: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
7490: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53  SQLITE_OK || ppS
74a0: 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d  tmt==0 || *ppStm
74b0: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49  t==0 );  /* VERI
74c0: 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20  FY: F13021 */.  
74d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
74e0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
74f0: 31 36 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  16_v2(.  sqlite3
7500: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
7510: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
7520: 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e  andle. */ .  con
7530: 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20 20  st void *zSql,  
7540: 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31 36         /* UTF-16
7550: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
7560: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  tement. */.  int
7570: 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20   nBytes,        
7580: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7590: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
75a0: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
75b0: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
75c0: 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e    /* OUT: A poin
75d0: 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61  ter to the prepa
75e0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
75f0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a  .  const void **
7600: 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20  pzTail       /* 
7610: 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73  OUT: End of pars
7620: 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ed string */.){.
7630: 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
7640: 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31   sqlite3Prepare1
7650: 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73  6(db,zSql,nBytes
7660: 2c 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f  ,SQLITE_PREPARE_
7670: 53 41 56 45 53 51 4c 2c 70 70 53 74 6d 74 2c 70  SAVESQL,ppStmt,p
7680: 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74  zTail);.  assert
7690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
76a0: 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20  || ppStmt==0 || 
76b0: 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f  *ppStmt==0 );  /
76c0: 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30 32 31  * VERIFY: F13021
76d0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
76e0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  .}.int sqlite3_p
76f0: 72 65 70 61 72 65 31 36 5f 76 33 28 0a 20 20 73  repare16_v3(.  s
7700: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
7710: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7720: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20  base handle. */ 
7730: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
7740: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql,         /* 
7750: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53  UTF-16 encoded S
7760: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  QL statement. */
7770: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20  .  int nBytes,  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7790: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
77a0: 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 6e  n bytes. */.  un
77b0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46  signed int prepF
77c0: 6c 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72 6f 20  lags,   /* Zero 
77d0: 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50  or more SQLITE_P
77e0: 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a  REPARE_* flags *
77f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
7800: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
7810: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
7820: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
7830: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
7840: 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61  onst void **pzTa
7850: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
7860: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
7870: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
7880: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
7890: 69 74 65 33 50 72 65 70 61 72 65 31 36 28 64 62  ite3Prepare16(db
78a0: 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 0a 20 20  ,zSql,nBytes,.  
78b0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52         SQLITE_PR
78c0: 45 50 41 52 45 5f 53 41 56 45 53 51 4c 7c 28 70  EPARE_SAVESQL|(p
78d0: 72 65 70 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  repFlags&SQLITE_
78e0: 50 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c 0a 20  PREPARE_MASK),. 
78f0: 20 20 20 20 20 20 20 20 70 70 53 74 6d 74 2c 70          ppStmt,p
7900: 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74  zTail);.  assert
7910: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7920: 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20  || ppStmt==0 || 
7930: 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f  *ppStmt==0 );  /
7940: 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30 32 31  * VERIFY: F13021
7950: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
7960: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
7970: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
7980: 2a 2f 0a                                         */.