/ Hex Artifact Content
Login

Artifact 48105b1a6082ac4f47cd6ebebe3678284733e1ea:


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 21 64 62 2d 3e 6d  db;.  if( !db->m
0380: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 28  allocFailed && (
0390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
03a0: 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
03b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
03c0: 4f 62 6a 3d 3d 30 20 29 20 7a 4f 62 6a 20 3d 20  Obj==0 ) zObj = 
03d0: 22 3f 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "?";.    sqlite3
03e0: 53 65 74 53 74 72 69 6e 67 28 70 44 61 74 61 2d  SetString(pData-
03f0: 3e 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20  >pzErrMsg, db,. 
0400: 20 20 20 20 20 22 6d 61 6c 66 6f 72 6d 65 64 20       "malformed 
0410: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
0420: 28 25 73 29 22 2c 20 7a 4f 62 6a 29 3b 0a 20 20  (%s)", zObj);.  
0430: 20 20 69 66 28 20 7a 45 78 74 72 61 20 29 7b 0a    if( zExtra ){.
0440: 20 20 20 20 20 20 2a 70 44 61 74 61 2d 3e 70 7a        *pData->pz
0450: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0460: 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 2a 70 44  MAppendf(db, *pD
0470: 61 74 61 2d 3e 70 7a 45 72 72 4d 73 67 2c 20 0a  ata->pzErrMsg, .
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 22 25 73 20 2d 20 25 73 22 2c 20 2a 70 44 61   "%s - %s", *pDa
04b0: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 2c 20 7a 45  ta->pzErrMsg, zE
04c0: 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtra);.    }.  }
04d0: 0a 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 64  .  pData->rc = d
04e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
04f0: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 3a  ? SQLITE_NOMEM :
0500: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
0510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
0520: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
0530: 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 63  outine for the c
0540: 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c  ode that initial
0550: 69 7a 65 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  izes the.** data
0560: 62 61 73 65 2e 20 20 53 65 65 20 73 71 6c 69 74  base.  See sqlit
0570: 65 33 49 6e 69 74 28 29 20 62 65 6c 6f 77 20 66  e3Init() below f
0580: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
0590: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  formation..** Th
05a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
05b0: 73 6f 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  so called from t
05c0: 68 65 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  he OP_ParseSchem
05d0: 61 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  a opcode of the 
05e0: 56 44 42 45 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  VDBE..**.** Each
05f0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 61 69   callback contai
0600: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
0610: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a   information:.**
0620: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20  .**     argv[0] 
0630: 3d 20 6e 61 6d 65 20 6f 66 20 74 68 69 6e 67 20  = name of thing 
0640: 62 65 69 6e 67 20 63 72 65 61 74 65 64 0a 2a 2a  being created.**
0650: 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 72       argv[1] = r
0660: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
0670: 66 6f 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  for table or ind
0680: 65 78 2e 20 30 20 66 6f 72 20 74 72 69 67 67 65  ex. 0 for trigge
0690: 72 20 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 20 20  r or view..**   
06a0: 20 20 61 72 67 76 5b 32 5d 20 3d 20 53 51 4c 20    argv[2] = SQL 
06b0: 74 65 78 74 20 66 6f 72 20 74 68 65 20 43 52 45  text for the CRE
06c0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ATE statement..*
06d0: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
06e0: 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69  InitCallback(voi
06f0: 64 20 2a 70 49 6e 69 74 2c 20 69 6e 74 20 61 72  d *pInit, int ar
0700: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
0710: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
0720: 7b 0a 20 20 49 6e 69 74 44 61 74 61 20 2a 70 44  {.  InitData *pD
0730: 61 74 61 20 3d 20 28 49 6e 69 74 44 61 74 61 2a  ata = (InitData*
0740: 29 70 49 6e 69 74 3b 0a 20 20 73 71 6c 69 74 65  )pInit;.  sqlite
0750: 33 20 2a 64 62 20 3d 20 70 44 61 74 61 2d 3e 64  3 *db = pData->d
0760: 62 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 70  b;.  int iDb = p
0770: 44 61 74 61 2d 3e 69 44 62 3b 0a 0a 20 20 61 73  Data->iDb;..  as
0780: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b  sert( argc==3 );
0790: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
07a0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61 72  TER2(NotUsed, ar
07b0: 67 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  gc);.  assert( s
07c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
07d0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
07e0: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
07f0: 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 45 6d  y(db, iDb, DB_Em
0800: 70 74 79 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pty);.  if( db->
0810: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
0820: 20 20 20 20 63 6f 72 72 75 70 74 53 63 68 65 6d      corruptSchem
0830: 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b 30 5d  a(pData, argv[0]
0840: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
0850: 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
0860: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
0870: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 69 66  <db->nDb );.  if
0880: 28 20 61 72 67 76 3d 3d 30 20 29 20 72 65 74 75  ( argv==0 ) retu
0890: 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 69 67 68 74  rn 0;   /* Might
08a0: 20 68 61 70 70 65 6e 20 69 66 20 45 4d 50 54 59   happen if EMPTY
08b0: 5f 52 45 53 55 4c 54 5f 43 41 4c 4c 42 41 43 4b  _RESULT_CALLBACK
08c0: 53 20 61 72 65 20 6f 6e 20 2a 2f 0a 20 20 69 66  S are on */.  if
08d0: 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a  ( argv[1]==0 ){.
08e0: 20 20 20 20 63 6f 72 72 75 70 74 53 63 68 65 6d      corruptSchem
08f0: 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b 30 5d  a(pData, argv[0]
0900: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
0910: 28 20 61 72 67 76 5b 32 5d 20 26 26 20 61 72 67  ( argv[2] && arg
0920: 76 5b 32 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 2f  v[2][0] ){.    /
0930: 2a 20 43 61 6c 6c 20 74 68 65 20 70 61 72 73 65  * Call the parse
0940: 72 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 43  r to process a C
0950: 52 45 41 54 45 20 54 41 42 4c 45 2c 20 49 4e 44  REATE TABLE, IND
0960: 45 58 20 6f 72 20 56 49 45 57 2e 0a 20 20 20 20  EX or VIEW..    
0970: 2a 2a 20 42 75 74 20 62 65 63 61 75 73 65 20 64  ** But because d
0980: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
0990: 73 65 74 20 74 6f 20 31 2c 20 6e 6f 20 56 44 42  set to 1, no VDB
09a0: 45 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  E code is genera
09b0: 74 65 64 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78  ted.    ** or ex
09c0: 65 63 75 74 65 64 2e 20 20 41 6c 6c 20 74 68 65  ecuted.  All the
09d0: 20 70 61 72 73 65 72 20 64 6f 65 73 20 69 73 20   parser does is 
09e0: 62 75 69 6c 64 20 74 68 65 20 69 6e 74 65 72 6e  build the intern
09f0: 61 6c 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 73  al data.    ** s
0a00: 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
0a10: 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
0a20: 65 2c 20 69 6e 64 65 78 2c 20 6f 72 20 76 69 65  e, index, or vie
0a30: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 45  w..    */.    TE
0a40: 53 54 4f 4e 4c 59 28 69 6e 74 20 72 63 70 29 3b  STONLY(int rcp);
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
0a60: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
0a70: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
0a80: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) */.    int rc;
0a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
0aa0: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 61  t *pStmt;..    a
0ab0: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
0ac0: 62 75 73 79 20 29 3b 0a 20 20 20 20 64 62 2d 3e  busy );.    db->
0ad0: 69 6e 69 74 2e 69 44 62 20 3d 20 69 44 62 3b 0a  init.iDb = iDb;.
0ae0: 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77      db->init.new
0af0: 54 6e 75 6d 20 3d 20 61 74 6f 69 28 61 72 67 76  Tnum = atoi(argv
0b00: 5b 31 5d 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e  [1]);.    db->in
0b10: 69 74 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72  it.orphanTrigger
0b20: 20 3d 20 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e   = 0;.    TESTON
0b30: 4c 59 28 72 63 70 20 3d 20 29 20 73 71 6c 69 74  LY(rcp = ) sqlit
0b40: 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 61  e3_prepare(db, a
0b50: 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 26 70 53 74  rgv[2], -1, &pSt
0b60: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  mt, 0);.    rc =
0b70: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20   db->errCode;.  
0b80: 20 20 61 73 73 65 72 74 28 20 28 72 63 26 30 78    assert( (rc&0x
0b90: 46 46 29 3d 3d 28 72 63 70 26 30 78 46 46 29 20  FF)==(rcp&0xFF) 
0ba0: 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  );.    db->init.
0bb0: 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  iDb = 0;.    if(
0bc0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
0bd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
0be0: 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69 67 67  init.orphanTrigg
0bf0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  er ){.        as
0c00: 73 65 72 74 28 20 69 44 62 3d 3d 31 20 29 3b 0a  sert( iDb==1 );.
0c10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
0c20: 20 20 20 20 20 70 44 61 74 61 2d 3e 72 63 20 3d       pData->rc =
0c30: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
0c40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
0c50: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  M ){.          d
0c60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0c70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
0c80: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
0c90: 45 5f 49 4e 54 45 52 52 55 50 54 20 26 26 20 28  E_INTERRUPT && (
0ca0: 72 63 26 30 78 46 46 29 21 3d 53 51 4c 49 54 45  rc&0xFF)!=SQLITE
0cb0: 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
0cc0: 20 20 20 20 20 63 6f 72 72 75 70 74 53 63 68 65       corruptSche
0cd0: 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b 30  ma(pData, argv[0
0ce0: 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ], sqlite3_errms
0cf0: 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  g(db));.        
0d00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
0d10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
0d20: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
0d30: 65 6c 73 65 20 69 66 28 20 61 72 67 76 5b 30 5d  else if( argv[0]
0d40: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 72 72 75  ==0 ){.    corru
0d50: 70 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20  ptSchema(pData, 
0d60: 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 0);.  }else{.
0d70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51      /* If the SQ
0d80: 4c 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6c 61 6e  L column is blan
0d90: 6b 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  k it means this 
0da0: 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
0db0: 0a 20 20 20 20 2a 2a 20 77 61 73 20 63 72 65 61  .    ** was crea
0dc0: 74 65 64 20 74 6f 20 62 65 20 74 68 65 20 50 52  ted to be the PR
0dd0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 74 6f 20  IMARY KEY or to 
0de0: 66 75 6c 66 69 6c 6c 20 61 20 55 4e 49 51 55 45  fulfill a UNIQUE
0df0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69  .    ** constrai
0e00: 6e 74 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  nt for a CREATE 
0e10: 54 41 42 4c 45 2e 20 20 54 68 65 20 69 6e 64 65  TABLE.  The inde
0e20: 78 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  x should have al
0e30: 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 62 65 65  ready.    ** bee
0e40: 6e 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 77  n created when w
0e50: 65 20 70 72 6f 63 65 73 73 65 64 20 74 68 65 20  e processed the 
0e60: 43 52 45 41 54 45 20 54 41 42 4c 45 2e 20 20 41  CREATE TABLE.  A
0e70: 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  ll we have.    *
0e80: 2a 20 74 6f 20 64 6f 20 68 65 72 65 20 69 73 20  * to do here is 
0e90: 72 65 63 6f 72 64 20 74 68 65 20 72 6f 6f 74 20  record the root 
0ea0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
0eb0: 74 68 61 74 20 69 6e 64 65 78 2e 0a 20 20 20 20  that index..    
0ec0: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
0ed0: 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78  ndex;.    pIndex
0ee0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
0ef0: 64 65 78 28 64 62 2c 20 61 72 67 76 5b 30 5d 2c  dex(db, argv[0],
0f00: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
0f10: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ame);.    if( pI
0f20: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ndex==0 ){.     
0f30: 20 2f 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63   /* This can occ
0f40: 75 72 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ur if there exis
0f50: 74 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 61  ts an index on a
0f60: 20 54 45 4d 50 20 74 61 62 6c 65 20 77 68 69 63   TEMP table whic
0f70: 68 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 74  h.      ** has t
0f80: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
0f90: 61 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 6f 6e  another index on
0fa0: 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64   a permanent ind
0fb0: 65 78 2e 20 20 53 69 6e 63 65 0a 20 20 20 20 20  ex.  Since.     
0fc0: 20 2a 2a 20 74 68 65 20 70 65 72 6d 61 6e 65 6e   ** the permanen
0fd0: 74 20 74 61 62 6c 65 20 69 73 20 68 69 64 64 65  t table is hidde
0fe0: 6e 20 62 79 20 74 68 65 20 54 45 4d 50 20 74 61  n by the TEMP ta
0ff0: 62 6c 65 2c 20 77 65 20 63 61 6e 20 61 6c 73 6f  ble, we can also
1000: 0a 20 20 20 20 20 20 2a 2a 20 73 61 66 65 6c 79  .      ** safely
1010: 20 69 67 6e 6f 72 65 20 74 68 65 20 69 6e 64 65   ignore the inde
1020: 78 20 6f 6e 20 74 68 65 20 70 65 72 6d 61 6e 65  x on the permane
1030: 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  nt table..      
1040: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 4e  */.      /* Do N
1050: 6f 74 68 69 6e 67 20 2a 2f 3b 0a 20 20 20 20 7d  othing */;.    }
1060: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1070: 47 65 74 49 6e 74 33 32 28 61 72 67 76 5b 31 5d  GetInt32(argv[1]
1080: 2c 20 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29  , &pIndex->tnum)
1090: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 72  ==0 ){.      cor
10a0: 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61  ruptSchema(pData
10b0: 2c 20 61 72 67 76 5b 30 5d 2c 20 22 69 6e 76 61  , argv[0], "inva
10c0: 6c 69 64 20 72 6f 6f 74 70 61 67 65 22 29 3b 0a  lid rootpage");.
10d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
10f0: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
1100: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1110: 6d 61 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ma and initializ
1120: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 64 61  e internal.** da
1130: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
1140: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
1150: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 69  ase file.  The i
1160: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
1170: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1180: 67 69 76 65 6e 20 62 79 20 69 44 62 2e 20 20 69  given by iDb.  i
1190: 44 62 3d 3d 30 20 69 73 20 75 73 65 64 20 66 6f  Db==0 is used fo
11a0: 72 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 61  r the main.** da
11b0: 74 61 62 61 73 65 2e 20 20 69 44 62 3d 3d 31 20  tabase.  iDb==1 
11c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
11d0: 75 73 65 64 2e 20 20 69 44 62 3e 3d 32 20 69 73  used.  iDb>=2 is
11e0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 75 78   used for.** aux
11f0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1200: 2e 20 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  .  Return one of
1210: 20 74 68 65 20 53 51 4c 49 54 45 5f 20 65 72 72   the SQLITE_ err
1220: 6f 72 20 63 6f 64 65 73 20 74 6f 0a 2a 2a 20 69  or codes to.** i
1230: 6e 64 69 63 61 74 65 20 73 75 63 63 65 73 73 20  ndicate success 
1240: 6f 72 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  or failure..*/.s
1250: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1260: 33 49 6e 69 74 4f 6e 65 28 73 71 6c 69 74 65 33  3InitOne(sqlite3
1270: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
1280: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b  har **pzErrMsg){
1290: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
12a0: 20 69 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a   i;.  int size;.
12b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
12c0: 20 44 62 20 2a 70 44 62 3b 0a 20 20 63 68 61 72   Db *pDb;.  char
12d0: 20 63 6f 6e 73 74 20 2a 61 7a 41 72 67 5b 34 5d   const *azArg[4]
12e0: 3b 0a 20 20 69 6e 74 20 6d 65 74 61 5b 35 5d 3b  ;.  int meta[5];
12f0: 0a 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74  .  InitData init
1300: 44 61 74 61 3b 0a 20 20 63 68 61 72 20 63 6f 6e  Data;.  char con
1310: 73 74 20 2a 7a 4d 61 73 74 65 72 53 63 68 65 6d  st *zMasterSchem
1320: 61 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  a;.  char const 
1330: 2a 7a 4d 61 73 74 65 72 4e 61 6d 65 20 3d 20 53  *zMasterName = S
1340: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1350: 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 65 64 54 72  ;.  int openedTr
1360: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 0a  ansaction = 0;..
1370: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    /*.  ** The ma
1380: 73 74 65 72 20 64 61 74 61 62 61 73 65 20 74 61  ster database ta
1390: 62 6c 65 20 68 61 73 20 61 20 73 74 72 75 63 74  ble has a struct
13a0: 75 72 65 20 6c 69 6b 65 20 74 68 69 73 0a 20 20  ure like this.  
13b0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
13c0: 74 20 63 68 61 72 20 6d 61 73 74 65 72 5f 73 63  t char master_sc
13d0: 68 65 6d 61 5b 5d 20 3d 20 0a 20 20 20 20 20 22  hema[] = .     "
13e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c  CREATE TABLE sql
13f0: 69 74 65 5f 6d 61 73 74 65 72 28 5c 6e 22 0a 20  ite_master(\n". 
1400: 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74      "  type text
1410: 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 6e 61 6d  ,\n".     "  nam
1420: 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
1430: 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74  "  tbl_name text
1440: 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 72 6f 6f  ,\n".     "  roo
1450: 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
1460: 22 0a 20 20 20 20 20 22 20 20 73 71 6c 20 74 65  ".     "  sql te
1470: 78 74 5c 6e 22 0a 20 20 20 20 20 22 29 22 0a 20  xt\n".     ")". 
1480: 20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   ;.#ifndef SQLIT
1490: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
14a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14b0: 72 20 74 65 6d 70 5f 6d 61 73 74 65 72 5f 73 63  r temp_master_sc
14c0: 68 65 6d 61 5b 5d 20 3d 20 0a 20 20 20 20 20 22  hema[] = .     "
14d0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
14e0: 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  E sqlite_temp_ma
14f0: 73 74 65 72 28 5c 6e 22 0a 20 20 20 20 20 22 20  ster(\n".     " 
1500: 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20   type text,\n". 
1510: 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
1520: 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 62 6c  ,\n".     "  tbl
1530: 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20  _name text,\n". 
1540: 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
1550: 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
1560: 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a   "  sql text\n".
1570: 20 20 20 20 20 22 29 22 0a 20 20 3b 0a 23 65 6c       ")".  ;.#el
1580: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 74 65 6d  se.  #define tem
1590: 70 5f 6d 61 73 74 65 72 5f 73 63 68 65 6d 61 20  p_master_schema 
15a0: 30 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  0.#endif..  asse
15b0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
15c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
15d0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
15e0: 44 62 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  Db].pSchema );. 
15f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1600: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
1610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1620: 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71  rt( iDb==1 || sq
1630: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1640: 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
1650: 5d 2e 70 42 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  ].pBt) );..  /* 
1660: 7a 4d 61 73 74 65 72 53 63 68 65 6d 61 20 61 6e  zMasterSchema an
1670: 64 20 7a 49 6e 69 74 53 63 72 69 70 74 20 61 72  d zInitScript ar
1680: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61  e set to point a
1690: 74 20 74 68 65 20 6d 61 73 74 65 72 20 73 63 68  t the master sch
16a0: 65 6d 61 0a 20 20 2a 2a 20 61 6e 64 20 69 6e 69  ema.  ** and ini
16b0: 74 69 61 6c 69 73 61 74 69 6f 6e 20 73 63 72 69  tialisation scri
16c0: 70 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  pt appropriate f
16d0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
16e0: 62 65 69 6e 67 0a 20 20 2a 2a 20 69 6e 69 74 69  being.  ** initi
16f0: 61 6c 69 73 65 64 2e 20 7a 4d 61 73 74 65 72 4e  alised. zMasterN
1700: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
1710: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
1720: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1730: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1740: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 7a 4d  iDb==1 ){.    zM
1750: 61 73 74 65 72 53 63 68 65 6d 61 20 3d 20 74 65  asterSchema = te
1760: 6d 70 5f 6d 61 73 74 65 72 5f 73 63 68 65 6d 61  mp_master_schema
1770: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1780: 4d 61 73 74 65 72 53 63 68 65 6d 61 20 3d 20 6d  MasterSchema = m
1790: 61 73 74 65 72 5f 73 63 68 65 6d 61 3b 0a 20 20  aster_schema;.  
17a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 4e 61 6d 65 20  }.  zMasterName 
17b0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
17c0: 44 62 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  Db);..  /* Const
17d0: 72 75 63 74 20 74 68 65 20 73 63 68 65 6d 61 20  ruct the schema 
17e0: 74 61 62 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 7a  tables.  */.  az
17f0: 41 72 67 5b 30 5d 20 3d 20 7a 4d 61 73 74 65 72  Arg[0] = zMaster
1800: 4e 61 6d 65 3b 0a 20 20 61 7a 41 72 67 5b 31 5d  Name;.  azArg[1]
1810: 20 3d 20 22 31 22 3b 0a 20 20 61 7a 41 72 67 5b   = "1";.  azArg[
1820: 32 5d 20 3d 20 7a 4d 61 73 74 65 72 53 63 68 65  2] = zMasterSche
1830: 6d 61 3b 0a 20 20 61 7a 41 72 67 5b 33 5d 20 3d  ma;.  azArg[3] =
1840: 20 30 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 64   0;.  initData.d
1850: 62 20 3d 20 64 62 3b 0a 20 20 69 6e 69 74 44 61  b = db;.  initDa
1860: 74 61 2e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  ta.iDb = iDb;.  
1870: 69 6e 69 74 44 61 74 61 2e 72 63 20 3d 20 53 51  initData.rc = SQ
1880: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 69 74 44  LITE_OK;.  initD
1890: 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 70  ata.pzErrMsg = p
18a0: 7a 45 72 72 4d 73 67 3b 0a 20 20 73 71 6c 69 74  zErrMsg;.  sqlit
18b0: 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 26  e3InitCallback(&
18c0: 69 6e 69 74 44 61 74 61 2c 20 33 2c 20 28 63 68  initData, 3, (ch
18d0: 61 72 20 2a 2a 29 61 7a 41 72 67 2c 20 30 29 3b  ar **)azArg, 0);
18e0: 0a 20 20 69 66 28 20 69 6e 69 74 44 61 74 61 2e  .  if( initData.
18f0: 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69  rc ){.    rc = i
1900: 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20  nitData.rc;.    
1910: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1920: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
1930: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1940: 2c 20 7a 4d 61 73 74 65 72 4e 61 6d 65 2c 20 64  , zMasterName, d
1950: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1960: 65 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  e);.  if( ALWAYS
1970: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 54  (pTab) ){.    pT
1980: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
1990: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
19a0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
19b0: 63 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64 20 74  cursor to hold t
19c0: 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
19d0: 0a 20 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  .  */.  pDb = &d
19e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 69  b->aDb[iDb];.  i
19f0: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
1a00: 7b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  {.    if( !OMIT_
1a10: 54 45 4d 50 44 42 20 26 26 20 41 4c 57 41 59 53  TEMPDB && ALWAYS
1a20: 28 69 44 62 3d 3d 31 29 20 29 7b 0a 20 20 20 20  (iDb==1) ){.    
1a30: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
1a40: 64 62 2c 20 31 2c 20 44 42 5f 53 63 68 65 6d 61  db, 1, DB_Schema
1a50: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Loaded);.    }. 
1a60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a70: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
1a80: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  f there is not a
1a90: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6f 6e  lready a read-on
1aa0: 6c 79 20 28 6f 72 20 72 65 61 64 2d 77 72 69 74  ly (or read-writ
1ab0: 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  e) transaction o
1ac0: 70 65 6e 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  pened.  ** on th
1ad0: 65 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  e b-tree databas
1ae0: 65 2c 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e  e, open one now.
1af0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
1b00: 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20 69 74 20  n is opened, it 
1b10: 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c  .  ** will be cl
1b20: 6f 73 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  osed before this
1b30: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1b40: 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  s.  */.  sqlite3
1b50: 42 74 72 65 65 45 6e 74 65 72 28 70 44 62 2d 3e  BtreeEnter(pDb->
1b60: 70 42 74 29 3b 0a 20 20 69 66 28 20 21 73 71 6c  pBt);.  if( !sql
1b70: 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
1b80: 64 54 72 61 6e 73 28 70 44 62 2d 3e 70 42 74 29  dTrans(pDb->pBt)
1b90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ba0: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1bb0: 61 6e 73 28 70 44 62 2d 3e 70 42 74 2c 20 30 29  ans(pDb->pBt, 0)
1bc0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1bd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1be0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
1bf0: 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  g(pzErrMsg, db, 
1c00: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
1c10: 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 20 20  Str(rc));.      
1c20: 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72 72  goto initone_err
1c30: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
1c40: 20 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74    openedTransact
1c50: 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ion = 1;.  }..  
1c60: 2f 2a 20 47 65 74 20 74 68 65 20 64 61 74 61 62  /* Get the datab
1c70: 61 73 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  ase meta informa
1c80: 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
1c90: 4d 65 74 61 20 76 61 6c 75 65 73 20 61 72 65 20  Meta values are 
1ca0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
1cb0: 20 20 20 20 6d 65 74 61 5b 30 5d 20 20 20 53 63      meta[0]   Sc
1cc0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 43 68  hema cookie.  Ch
1cd0: 61 6e 67 65 73 20 77 69 74 68 20 65 61 63 68 20  anges with each 
1ce0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e 0a 20  schema change.. 
1cf0: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 31 5d 20 20   **    meta[1]  
1d00: 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 6f 66 20   File format of 
1d10: 73 63 68 65 6d 61 20 6c 61 79 65 72 2e 0a 20 20  schema layer..  
1d20: 2a 2a 20 20 20 20 6d 65 74 61 5b 32 5d 20 20 20  **    meta[2]   
1d30: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
1d40: 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 20 20 20   cache..  **    
1d50: 6d 65 74 61 5b 33 5d 20 20 20 4c 61 72 67 65 73  meta[3]   Larges
1d60: 74 20 72 6f 6f 74 70 61 67 65 20 28 61 75 74 6f  t rootpage (auto
1d70: 2f 69 6e 63 72 5f 76 61 63 75 75 6d 20 6d 6f 64  /incr_vacuum mod
1d80: 65 29 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b  e).  **    meta[
1d90: 34 5d 20 20 20 44 62 20 74 65 78 74 20 65 6e 63  4]   Db text enc
1da0: 6f 64 69 6e 67 2e 20 31 3a 55 54 46 2d 38 20 32  oding. 1:UTF-8 2
1db0: 3a 55 54 46 2d 31 36 4c 45 20 33 3a 55 54 46 2d  :UTF-16LE 3:UTF-
1dc0: 31 36 42 45 0a 20 20 2a 2a 20 20 20 20 6d 65 74  16BE.  **    met
1dd0: 61 5b 35 5d 20 20 20 55 73 65 72 20 76 65 72 73  a[5]   User vers
1de0: 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61  ion.  **    meta
1df0: 5b 36 5d 20 20 20 49 6e 63 72 65 6d 65 6e 74 61  [6]   Incrementa
1e00: 6c 20 76 61 63 75 75 6d 20 6d 6f 64 65 0a 20 20  l vacuum mode.  
1e10: 2a 2a 20 20 20 20 6d 65 74 61 5b 37 5d 20 20 20  **    meta[7]   
1e20: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20 20 6d  unused.  **    m
1e30: 65 74 61 5b 38 5d 20 20 20 75 6e 75 73 65 64 0a  eta[8]   unused.
1e40: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 39 5d 20    **    meta[9] 
1e50: 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a 0a 20 20    unused.  **.  
1e60: 2a 2a 20 4e 6f 74 65 3a 20 54 68 65 20 23 64 65  ** Note: The #de
1e70: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 55 54 46  fined SQLITE_UTF
1e80: 2a 20 73 79 6d 62 6f 6c 73 20 69 6e 20 73 71 6c  * symbols in sql
1e90: 69 74 65 49 6e 74 2e 68 20 63 6f 72 72 65 73 70  iteInt.h corresp
1ea0: 6f 6e 64 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ond to.  ** the 
1eb0: 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20  possible values 
1ec0: 6f 66 20 6d 65 74 61 5b 34 5d 2e 0a 20 20 2a 2f  of meta[4]..  */
1ed0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
1ee0: 72 61 79 53 69 7a 65 28 6d 65 74 61 29 3b 20 69  raySize(meta); i
1ef0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1f00: 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 44 62  BtreeGetMeta(pDb
1f10: 2d 3e 70 42 74 2c 20 69 2b 31 2c 20 28 75 33 32  ->pBt, i+1, (u32
1f20: 20 2a 29 26 6d 65 74 61 5b 69 5d 29 3b 0a 20 20   *)&meta[i]);.  
1f30: 7d 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  }.  pDb->pSchema
1f40: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ->schema_cookie 
1f50: 3d 20 6d 65 74 61 5b 42 54 52 45 45 5f 53 43 48  = meta[BTREE_SCH
1f60: 45 4d 41 5f 56 45 52 53 49 4f 4e 2d 31 5d 3b 0a  EMA_VERSION-1];.
1f70: 0a 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67  .  /* If opening
1f80: 20 61 20 6e 6f 6e 2d 65 6d 70 74 79 20 64 61 74   a non-empty dat
1f90: 61 62 61 73 65 2c 20 63 68 65 63 6b 20 74 68 65  abase, check the
1fa0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20   text encoding. 
1fb0: 46 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69  For the.  ** mai
1fc0: 6e 20 64 61 74 61 62 61 73 65 2c 20 73 65 74 20  n database, set 
1fd0: 73 71 6c 69 74 65 33 2e 65 6e 63 20 74 6f 20 74  sqlite3.enc to t
1fe0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
1ff0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2000: 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 61 74  ..  ** For an at
2010: 74 61 63 68 65 64 20 64 62 2c 20 69 74 20 69 73  tached db, it is
2020: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
2030: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 6e 6f 74   encoding is not
2040: 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61   the same.  ** a
2050: 73 20 73 71 6c 69 74 65 33 2e 65 6e 63 2e 0a 20  s sqlite3.enc.. 
2060: 20 2a 2f 0a 20 20 69 66 28 20 6d 65 74 61 5b 42   */.  if( meta[B
2070: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
2080: 4e 47 2d 31 5d 20 29 7b 20 20 2f 2a 20 74 65 78  NG-1] ){  /* tex
2090: 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  t encoding */.  
20a0: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
20b0: 20 20 20 20 20 20 75 38 20 65 6e 63 6f 64 69 6e        u8 encodin
20c0: 67 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6f  g;.      /* If o
20d0: 70 65 6e 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  pening the main 
20e0: 64 61 74 61 62 61 73 65 2c 20 73 65 74 20 45 4e  database, set EN
20f0: 43 28 64 62 29 2e 20 2a 2f 0a 20 20 20 20 20 20  C(db). */.      
2100: 65 6e 63 6f 64 69 6e 67 20 3d 20 28 75 38 29 6d  encoding = (u8)m
2110: 65 74 61 5b 42 54 52 45 45 5f 54 45 58 54 5f 45  eta[BTREE_TEXT_E
2120: 4e 43 4f 44 49 4e 47 2d 31 5d 20 26 20 33 3b 0a  NCODING-1] & 3;.
2130: 20 20 20 20 20 20 69 66 28 20 65 6e 63 6f 64 69        if( encodi
2140: 6e 67 3d 3d 30 20 29 20 65 6e 63 6f 64 69 6e 67  ng==0 ) encoding
2150: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
2160: 20 20 20 20 20 20 45 4e 43 28 64 62 29 20 3d 20        ENC(db) = 
2170: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20  encoding;.      
2180: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
2190: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
21a0: 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
21b0: 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29  F8, "BINARY", 0)
21c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d0: 20 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67     /* If opening
21e0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
21f0: 61 62 61 73 65 2c 20 74 68 65 20 65 6e 63 6f 64  abase, the encod
2200: 69 6e 67 20 6d 75 63 68 20 6d 61 74 63 68 20 45  ing much match E
2210: 4e 43 28 64 62 29 20 2a 2f 0a 20 20 20 20 20 20  NC(db) */.      
2220: 69 66 28 20 6d 65 74 61 5b 42 54 52 45 45 5f 54  if( meta[BTREE_T
2230: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 21  EXT_ENCODING-1]!
2240: 3d 45 4e 43 28 64 62 29 20 29 7b 0a 20 20 20 20  =ENC(db) ){.    
2250: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2260: 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 64  ring(pzErrMsg, d
2270: 62 2c 20 22 61 74 74 61 63 68 65 64 20 64 61 74  b, "attached dat
2280: 61 62 61 73 65 73 20 6d 75 73 74 20 75 73 65 20  abases must use 
2290: 74 68 65 20 73 61 6d 65 22 0a 20 20 20 20 20 20  the same".      
22a0: 20 20 20 20 20 20 22 20 74 65 78 74 20 65 6e 63        " text enc
22b0: 6f 64 69 6e 67 20 61 73 20 6d 61 69 6e 20 64 61  oding as main da
22c0: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
22d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
22e0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
22f0: 6f 20 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f  o initone_error_
2300: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
2310: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2320: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
2330: 2c 20 69 44 62 2c 20 44 42 5f 45 6d 70 74 79 29  , iDb, DB_Empty)
2340: 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 53 63  ;.  }.  pDb->pSc
2350: 68 65 6d 61 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  hema->enc = ENC(
2360: 64 62 29 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d  db);..  if( pDb-
2370: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
2380: 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  size==0 ){.    s
2390: 69 7a 65 20 3d 20 6d 65 74 61 5b 42 54 52 45 45  ize = meta[BTREE
23a0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
23b0: 49 5a 45 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  IZE-1];.    if( 
23c0: 73 69 7a 65 3d 3d 30 20 29 7b 20 73 69 7a 65 20  size==0 ){ size 
23d0: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
23e0: 5f 43 41 43 48 45 5f 53 49 5a 45 3b 20 7d 0a 20  _CACHE_SIZE; }. 
23f0: 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20     if( size<0 ) 
2400: 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
2410: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
2420: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
2430: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  e;.    sqlite3Bt
2440: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
2450: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
2460: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
2470: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ze);.  }..  /*. 
2480: 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d   ** file_format=
2490: 3d 31 20 20 20 20 56 65 72 73 69 6f 6e 20 33 2e  =1    Version 3.
24a0: 30 2e 30 2e 0a 20 20 2a 2a 20 66 69 6c 65 5f 66  0.0..  ** file_f
24b0: 6f 72 6d 61 74 3d 3d 32 20 20 20 20 56 65 72 73  ormat==2    Vers
24c0: 69 6f 6e 20 33 2e 31 2e 33 2e 20 20 2f 2f 20 41  ion 3.1.3.  // A
24d0: 4c 54 45 52 20 54 41 42 4c 45 20 41 44 44 20 43  LTER TABLE ADD C
24e0: 4f 4c 55 4d 4e 0a 20 20 2a 2a 20 66 69 6c 65 5f  OLUMN.  ** file_
24f0: 66 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56 65 72  format==3    Ver
2500: 73 69 6f 6e 20 33 2e 31 2e 34 2e 20 20 2f 2f 20  sion 3.1.4.  // 
2510: 64 69 74 74 6f 20 62 75 74 20 77 69 74 68 20 6e  ditto but with n
2520: 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 73  on-NULL defaults
2530: 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61  .  ** file_forma
2540: 74 3d 3d 34 20 20 20 20 56 65 72 73 69 6f 6e 20  t==4    Version 
2550: 33 2e 33 2e 30 2e 20 20 2f 2f 20 44 45 53 43 20  3.3.0.  // DESC 
2560: 69 6e 64 69 63 65 73 2e 20 20 42 6f 6f 6c 65 61  indices.  Boolea
2570: 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  n constants.  */
2580: 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  .  pDb->pSchema-
2590: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 28  >file_format = (
25a0: 75 38 29 6d 65 74 61 5b 42 54 52 45 45 5f 46 49  u8)meta[BTREE_FI
25b0: 4c 45 5f 46 4f 52 4d 41 54 2d 31 5d 3b 0a 20 20  LE_FORMAT-1];.  
25c0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
25d0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 30  ->file_format==0
25e0: 20 29 7b 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   ){.    pDb->pSc
25f0: 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
2600: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 1;.  }.  if(
2610: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
2620: 69 6c 65 5f 66 6f 72 6d 61 74 3e 53 51 4c 49 54  ile_format>SQLIT
2630: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
2640: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
2650: 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
2660: 73 67 2c 20 64 62 2c 20 22 75 6e 73 75 70 70 6f  sg, db, "unsuppo
2670: 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d 61 74  rted file format
2680: 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ");.    rc = SQL
2690: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67  ITE_ERROR;.    g
26a0: 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72 72 6f  oto initone_erro
26b0: 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
26c0: 20 54 69 63 6b 65 74 20 23 32 38 30 34 3a 20 20   Ticket #2804:  
26d0: 57 68 65 6e 20 77 65 20 6f 70 65 6e 20 61 20 64  When we open a d
26e0: 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20 6e  atabase in the n
26f0: 65 77 65 72 20 66 69 6c 65 20 66 6f 72 6d 61 74  ewer file format
2700: 2c 0a 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65  ,.  ** clear the
2710: 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f 66 6f 72   legacy_file_for
2720: 6d 61 74 20 70 72 61 67 6d 61 20 66 6c 61 67 20  mat pragma flag 
2730: 73 6f 20 74 68 61 74 20 61 20 56 41 43 55 55 4d  so that a VACUUM
2740: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6e 6f 74 20 64   will.  ** not d
2750: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 64 61 74  owngrade the dat
2760: 61 62 61 73 65 20 61 6e 64 20 74 68 75 73 20 69  abase and thus i
2770: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 64 65  nvalidate any de
2780: 73 63 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 69 6e  scending.  ** in
2790: 64 69 63 65 73 20 74 68 61 74 20 74 68 65 20 75  dices that the u
27a0: 73 65 72 20 6d 69 67 68 74 20 68 61 76 65 20 63  ser might have c
27b0: 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  reated..  */.  i
27c0: 66 28 20 69 44 62 3d 3d 30 20 26 26 20 6d 65 74  f( iDb==0 && met
27d0: 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  a[BTREE_FILE_FOR
27e0: 4d 41 54 2d 31 5d 3e 3d 34 20 29 7b 0a 20 20 20  MAT-1]>=4 ){.   
27f0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2800: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
2810: 46 6d 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  Fmt;.  }..  /* R
2820: 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  ead the schema i
2830: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
2840: 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62  f the schema tab
2850: 6c 65 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
2860: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
2870: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 63 68 61 72   );.  {.    char
2880: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 7a 53 71 6c   *zSql;.    zSql
2890: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
28a0: 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22  f(db, .        "
28b0: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f  SELECT name, roo
28c0: 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20  tpage, sql FROM 
28d0: 27 25 71 27 2e 25 73 20 4f 52 44 45 52 20 42 59  '%q'.%s ORDER BY
28e0: 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20   rowid",.       
28f0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
2900: 61 6d 65 2c 20 7a 4d 61 73 74 65 72 4e 61 6d 65  ame, zMasterName
2910: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2920: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
2930: 54 49 4f 4e 0a 20 20 20 20 7b 0a 20 20 20 20 20  TION.    {.     
2940: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
2950: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
2960: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
2970: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
2980: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
2990: 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
29a0: 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78 41 75  h;.      db->xAu
29b0: 74 68 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  th = 0;.#endif. 
29c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29d0: 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
29e0: 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c   sqlite3InitCall
29f0: 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c  back, &initData,
2a00: 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2a10: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
2a20: 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 64 62 2d  ZATION.      db-
2a30: 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
2a40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a60: 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61  OK ) rc = initDa
2a70: 74 61 2e 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  ta.rc;.    sqlit
2a80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2a90: 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2aa0: 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a  TE_OMIT_ANALYZE.
2ab0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ac0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2ad0: 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
2ae0: 61 64 28 64 62 2c 20 69 44 62 29 3b 0a 20 20 20  ad(db, iDb);.   
2af0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
2b00: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2b10: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  iled ){.    rc =
2b20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b30: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
2b40: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
2b50: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
2b60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2b70: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
2b80: 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
2b90: 29 7b 0a 20 20 20 20 2f 2a 20 42 6c 61 63 6b 20  ){.    /* Black 
2ba0: 6d 61 67 69 63 3a 20 49 66 20 74 68 65 20 53 51  magic: If the SQ
2bb0: 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
2bc0: 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  e flag is set, t
2bd0: 68 65 6e 20 63 6f 6e 73 69 64 65 72 0a 20 20 20  hen consider.   
2be0: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 6c   ** the schema l
2bf0: 6f 61 64 65 64 2c 20 65 76 65 6e 20 69 66 20 65  oaded, even if e
2c00: 72 72 6f 72 73 20 6f 63 63 75 72 72 65 64 2e 20  rrors occurred. 
2c10: 49 6e 20 74 68 69 73 20 73 69 74 75 61 74 69 6f  In this situatio
2c20: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75  n the .    ** cu
2c30: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 70 72  rrent sqlite3_pr
2c40: 65 70 61 72 65 28 29 20 6f 70 65 72 61 74 69 6f  epare() operatio
2c50: 6e 20 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74  n will fail, but
2c60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
2c70: 6e 65 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 61  ne.    ** will a
2c80: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 69 6c  ttempt to compil
2c90: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  e the supplied s
2ca0: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74  tatement against
2cb0: 20 77 68 61 74 65 76 65 72 20 73 75 62 73 65 74   whatever subset
2cc0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
2cd0: 63 68 65 6d 61 20 77 61 73 20 6c 6f 61 64 65 64  chema was loaded
2ce0: 20 62 65 66 6f 72 65 20 74 68 65 20 65 72 72 6f   before the erro
2cf0: 72 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20  r occurred. The 
2d00: 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 70  primary.    ** p
2d10: 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 69  urpose of this i
2d20: 73 20 74 6f 20 61 6c 6c 6f 77 20 61 63 63 65 73  s to allow acces
2d30: 73 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  s to the sqlite_
2d40: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20  master table.   
2d50: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 69 74   ** even when it
2d60: 73 20 63 6f 6e 74 65 6e 74 73 20 68 61 76 65 20  s contents have 
2d70: 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64 2e 0a  been corrupted..
2d80: 20 20 20 20 2a 2f 0a 20 20 20 20 44 62 53 65 74      */.    DbSet
2d90: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
2da0: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
2db0: 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  d);.    rc = SQL
2dc0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
2dd0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
2de0: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  an error that oc
2df0: 63 75 72 73 20 61 66 74 65 72 20 73 75 63 63 65  curs after succe
2e00: 73 73 66 75 6c 6c 79 20 61 6c 6c 6f 63 61 74 69  ssfully allocati
2e10: 6e 67 0a 20 20 2a 2a 20 63 75 72 4d 61 69 6e 20  ng.  ** curMain 
2e20: 61 6e 64 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  and calling sqli
2e30: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 2e  te3BtreeEnter().
2e40: 20 46 6f 72 20 61 6e 20 65 72 72 6f 72 20 74 68   For an error th
2e50: 61 74 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 62  at occurs.  ** b
2e60: 65 66 6f 72 65 20 74 68 61 74 20 70 6f 69 6e 74  efore that point
2e70: 2c 20 6a 75 6d 70 20 74 6f 20 65 72 72 6f 72 5f  , jump to error_
2e80: 6f 75 74 2e 0a 20 20 2a 2f 0a 69 6e 69 74 6f 6e  out..  */.initon
2e90: 65 5f 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69  e_error_out:.  i
2ea0: 66 28 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63  f( openedTransac
2eb0: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  tion ){.    sqli
2ec0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
2ed0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20  Db->pBt);.  }.  
2ee0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2ef0: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 0a 65 72  e(pDb->pBt);..er
2f00: 72 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  ror_out:.  if( r
2f10: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2f20: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  || rc==SQLITE_IO
2f30: 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
2f40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2f50: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 1;.  }.  ret
2f60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f70: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   Initialize all 
2f80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 2d  database files -
2f90: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2fa0: 73 65 20 66 69 6c 65 2c 20 74 68 65 20 66 69 6c  se file, the fil
2fb0: 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  e.** used to sto
2fc0: 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  re temporary tab
2fd0: 6c 65 73 2c 20 61 6e 64 20 61 6e 79 20 61 64 64  les, and any add
2fe0: 69 74 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65  itional database
2ff0: 20 66 69 6c 65 73 0a 2a 2a 20 63 72 65 61 74 65   files.** create
3000: 64 20 75 73 69 6e 67 20 41 54 54 41 43 48 20 73  d using ATTACH s
3010: 74 61 74 65 6d 65 6e 74 73 2e 20 20 52 65 74 75  tatements.  Retu
3020: 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
3030: 65 2e 20 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  e.  If an.** err
3040: 6f 72 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65  or occurs, write
3050: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
3060: 65 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  e into *pzErrMsg
3070: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 61 20  ..**.** After a 
3080: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 69 74  database is init
3090: 69 61 6c 69 7a 65 64 2c 20 74 68 65 20 44 42 5f  ialized, the DB_
30a0: 53 63 68 65 6d 61 4c 6f 61 64 65 64 20 62 69 74  SchemaLoaded bit
30b0: 20 69 73 20 73 65 74 0a 2a 2a 20 62 69 74 20 69   is set.** bit i
30c0: 73 20 73 65 74 20 69 6e 20 74 68 65 20 66 6c 61  s set in the fla
30d0: 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
30e0: 44 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66  Db structure. If
30f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3100: 20 66 69 6c 65 20 77 61 73 20 6f 66 20 7a 65 72   file was of zer
3110: 6f 2d 6c 65 6e 67 74 68 2c 20 74 68 65 6e 20 74  o-length, then t
3120: 68 65 20 44 42 5f 45 6d 70 74 79 20 66 6c 61 67  he DB_Empty flag
3130: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 0a 2a 2f   is also set..*/
3140: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 69 74  .int sqlite3Init
3150: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68  (sqlite3 *db, ch
3160: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a  ar **pzErrMsg){.
3170: 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 69    int i, rc;.  i
3180: 6e 74 20 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e  nt commit_intern
3190: 61 6c 20 3d 20 21 28 64 62 2d 3e 66 6c 61 67 73  al = !(db->flags
31a0: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
31b0: 61 6e 67 65 73 29 3b 0a 20 20 0a 20 20 61 73 73  anges);.  .  ass
31c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31d0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
31e0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  x) );.  rc = SQL
31f0: 49 54 45 5f 4f 4b 3b 0a 20 20 64 62 2d 3e 69 6e  ITE_OK;.  db->in
3200: 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 66  it.busy = 1;.  f
3210: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
3220: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
3230: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
3240: 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
3250: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
3260: 4c 6f 61 64 65 64 29 20 7c 7c 20 69 3d 3d 31 20  Loaded) || i==1 
3270: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3280: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
3290: 4f 6e 65 28 64 62 2c 20 69 2c 20 70 7a 45 72 72  One(db, i, pzErr
32a0: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
32b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32c0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
32d0: 68 65 6d 61 28 64 62 2c 20 69 29 3b 0a 20 20 20  hema(db, i);.   
32e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 63   }.  }..  /* Onc
32f0: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
3300: 64 61 74 61 62 61 73 65 73 20 68 61 76 65 20 62  databases have b
3310: 65 65 6e 20 69 6e 69 74 69 61 6c 69 73 65 64 2c  een initialised,
3320: 20 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61   load the schema
3330: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 54 45  .  ** for the TE
3340: 4d 50 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  MP database. Thi
3350: 73 20 69 73 20 6c 6f 61 64 65 64 20 6c 61 73 74  s is loaded last
3360: 2c 20 61 73 20 74 68 65 20 54 45 4d 50 20 64 61  , as the TEMP da
3370: 74 61 62 61 73 65 0a 20 20 2a 2a 20 73 63 68 65  tabase.  ** sche
3380: 6d 61 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 72  ma may contain r
3390: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 6f 62 6a  eferences to obj
33a0: 65 63 74 73 20 69 6e 20 6f 74 68 65 72 20 64 61  ects in other da
33b0: 74 61 62 61 73 65 73 2e 0a 20 20 2a 2f 0a 23 69  tabases..  */.#i
33c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33d0: 54 5f 54 45 4d 50 44 42 0a 20 20 69 66 28 20 72  T_TEMPDB.  if( r
33e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33f0: 41 4c 57 41 59 53 28 64 62 2d 3e 6e 44 62 3e 31  ALWAYS(db->nDb>1
3400: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3410: 20 20 20 20 20 20 26 26 20 21 44 62 48 61 73 50        && !DbHasP
3420: 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20 44  roperty(db, 1, D
3430: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
3440: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3450: 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20 31  te3InitOne(db, 1
3460: 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
3470: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
3480: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
3490: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
34a0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  1);.    }.  }.#e
34b0: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 69 6e 69 74  ndif..  db->init
34c0: 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28  .busy = 0;.  if(
34d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34e0: 26 20 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61  & commit_interna
34f0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
3500: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
3510: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 0a  anges(db);.  }..
3520: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a    return rc; .}.
3530: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3540: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ine is a no-op i
3550: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
3560: 63 68 65 6d 61 20 69 73 20 61 6c 72 65 61 64 79  chema is already
3570: 20 69 6e 69 74 69 61 6c 69 73 65 64 2e 0a 2a 2a   initialised..**
3580: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
3590: 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64  schema is loaded
35a0: 2e 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  . An error code 
35b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
35c0: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 61 64 53  int sqlite3ReadS
35d0: 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
35e0: 72 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rse){.  int rc =
35f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
3600: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3610: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
3620: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3630: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
3640: 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  );.  if( !db->in
3650: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 72  it.busy ){.    r
3660: 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28  c = sqlite3Init(
3670: 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72  db, &pParse->zEr
3680: 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rMsg);.  }.  if(
3690: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36a0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
36b0: 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 72 73   = rc;.    pPars
36c0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  e->nErr++;.  }. 
36d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
36e0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 73 63 68 65  /*.** Check sche
36f0: 6d 61 20 63 6f 6f 6b 69 65 73 20 69 6e 20 61 6c  ma cookies in al
3700: 6c 20 64 61 74 61 62 61 73 65 73 2e 20 20 49 66  l databases.  If
3710: 20 61 6e 79 20 63 6f 6f 6b 69 65 20 69 73 20 6f   any cookie is o
3720: 75 74 0a 2a 2a 20 6f 66 20 64 61 74 65 20 73 65  ut.** of date se
3730: 74 20 70 50 61 72 73 65 2d 3e 72 63 20 74 6f 20  t pParse->rc to 
3740: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20 20  SQLITE_SCHEMA.  
3750: 49 66 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  If all schema co
3760: 6f 6b 69 65 73 0a 2a 2a 20 6d 61 6b 65 20 6e 6f  okies.** make no
3770: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 50 61 72   changes to pPar
3780: 73 65 2d 3e 72 63 2e 0a 2a 2f 0a 73 74 61 74 69  se->rc..*/.stati
3790: 63 20 76 6f 69 64 20 73 63 68 65 6d 61 49 73 56  c void schemaIsV
37a0: 61 6c 69 64 28 50 61 72 73 65 20 2a 70 50 61 72  alid(Parse *pPar
37b0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
37c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
37d0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
37e0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 63 6f 6f 6b  t rc;.  int cook
37f0: 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ie;..  assert( p
3800: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
3810: 6d 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ma );.  assert( 
3820: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3830: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
3840: 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44  .  for(iDb=0; iD
3850: 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
3860: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e 65  ){.    int opene
3870: 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30  dTransaction = 0
3880: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
3890: 65 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  e if a transacti
38a0: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 2a 2f 0a  on is opened */.
38b0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
38c0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
38d0: 74 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  t;     /* Btree 
38e0: 64 61 74 61 62 61 73 65 20 74 6f 20 72 65 61 64  database to read
38f0: 20 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 2a 2f 0a   cookie from */.
3900: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
3910: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
3920: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
3930: 6f 74 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ot already a rea
3940: 64 2d 6f 6e 6c 79 20 28 6f 72 20 72 65 61 64 2d  d-only (or read-
3950: 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
3960: 6f 6e 20 6f 70 65 6e 65 64 0a 20 20 20 20 2a 2a  on opened.    **
3970: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 64   on the b-tree d
3980: 61 74 61 62 61 73 65 2c 20 6f 70 65 6e 20 6f 6e  atabase, open on
3990: 65 20 6e 6f 77 2e 20 49 66 20 61 20 74 72 61 6e  e now. If a tran
39a0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
39b0: 64 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  d, it .    ** wi
39c0: 6c 6c 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ll be closed imm
39d0: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 72  ediately after r
39e0: 65 61 64 69 6e 67 20 74 68 65 20 6d 65 74 61 2d  eading the meta-
39f0: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 69 66  value. */.    if
3a00: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  ( !sqlite3BtreeI
3a10: 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
3a20: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
3a30: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
3a40: 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a  nTrans(pBt, 0);.
3a50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
3a60: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63  LITE_NOMEM || rc
3a70: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
3a80: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  OMEM ){.        
3a90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3aa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
3ab0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3ac0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
3ad0: 20 20 20 20 20 20 6f 70 65 6e 65 64 54 72 61 6e        openedTran
3ae0: 73 61 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20  saction = 1;.   
3af0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   }..    /* Read 
3b00: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
3b10: 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
3b20: 61 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ase. If it does 
3b30: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 0a 20  not match the . 
3b40: 20 20 20 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72     ** value stor
3b50: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
3b60: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 63 68 65  e in-memory sche
3b70: 6d 61 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ma representatio
3b80: 6e 2c 0a 20 20 20 20 2a 2a 20 73 65 74 20 50 61  n,.    ** set Pa
3b90: 72 73 65 2e 72 63 20 74 6f 20 53 51 4c 49 54 45  rse.rc to SQLITE
3ba0: 5f 53 43 48 45 4d 41 2e 20 2a 2f 0a 20 20 20 20  _SCHEMA. */.    
3bb0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
3bc0: 65 74 61 28 70 42 74 2c 20 42 54 52 45 45 5f 53  eta(pBt, BTREE_S
3bd0: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28  CHEMA_VERSION, (
3be0: 75 33 32 20 2a 29 26 63 6f 6f 6b 69 65 29 3b 0a  u32 *)&cookie);.
3bf0: 20 20 20 20 69 66 28 20 63 6f 6f 6b 69 65 21 3d      if( cookie!=
3c00: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3c10: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
3c20: 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  kie ){.      pPa
3c30: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
3c40: 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 7d 0a 0a  _SCHEMA;.    }..
3c50: 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65      /* Close the
3c60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
3c70: 20 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65 64 2e   one was opened.
3c80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 65 6e   */.    if( open
3c90: 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  edTransaction ){
3ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3cb0: 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
3cc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3cd0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 68  ** Convert a sch
3ce0: 65 6d 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ema pointer into
3cf0: 20 74 68 65 20 69 44 62 20 69 6e 64 65 78 20 74   the iDb index t
3d00: 68 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  hat indicates.**
3d10: 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65 20   which database 
3d20: 66 69 6c 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  file in db->aDb[
3d30: 5d 20 74 68 65 20 73 63 68 65 6d 61 20 72 65 66  ] the schema ref
3d40: 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ers to..**.** If
3d50: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
3d60: 73 65 20 69 73 20 61 74 74 61 63 68 65 64 20 6d  se is attached m
3d70: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74  ore than once, t
3d80: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 74 74 61  he first.** atta
3d90: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69 73  ched database is
3da0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
3db0: 74 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  t sqlite3SchemaT
3dc0: 6f 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  oIndex(sqlite3 *
3dd0: 64 62 2c 20 53 63 68 65 6d 61 20 2a 70 53 63 68  db, Schema *pSch
3de0: 65 6d 61 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ema){.  int i = 
3df0: 2d 31 30 30 30 30 30 30 3b 0a 0a 20 20 2f 2a 20  -1000000;..  /* 
3e00: 49 66 20 70 53 63 68 65 6d 61 20 69 73 20 4e 55  If pSchema is NU
3e10: 4c 4c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  LL, then return 
3e20: 2d 31 30 30 30 30 30 30 2e 20 54 68 69 73 20 68  -1000000. This h
3e30: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 65  appens when code
3e40: 20 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e 63   in .  ** expr.c
3e50: 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 72 65   is trying to re
3e60: 73 6f 6c 76 65 20 61 20 72 65 66 65 72 65 6e 63  solve a referenc
3e70: 65 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  e to a transient
3e80: 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e 65   table (i.e. one
3e90: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
3ea0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2e 20   a sub-select). 
3eb0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
3ec0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
3ed0: 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
3ee0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  tion should neve
3ef0: 72 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 0a  r be used..  **.
3f00: 20 20 2a 2a 20 57 65 20 72 65 74 75 72 6e 20 2d    ** We return -
3f10: 31 30 30 30 30 30 30 20 69 6e 73 74 65 61 64 20  1000000 instead 
3f20: 6f 66 20 74 68 65 20 6d 6f 72 65 20 75 73 75 61  of the more usua
3f30: 6c 20 2d 31 20 73 69 6d 70 6c 79 20 62 65 63 61  l -1 simply beca
3f40: 75 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20 2d  use using.  ** -
3f50: 31 30 30 30 30 30 30 20 61 73 20 74 68 65 20 69  1000000 as the i
3f60: 6e 63 6f 72 72 65 63 74 20 69 6e 64 65 78 20 69  ncorrect index i
3f70: 6e 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69 73  nto db->aDb[] is
3f80: 20 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72 65   much .  ** more
3f90: 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75 73 65   likely to cause
3fa0: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 61 6e   a segfault than
3fb0: 20 2d 31 20 28 6f 66 20 63 6f 75 72 73 65 20 74   -1 (of course t
3fc0: 68 65 72 65 20 61 72 65 20 61 73 73 65 72 74 28  here are assert(
3fd0: 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ).  ** statement
3fe0: 73 20 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e 65  s too, but it ne
3ff0: 76 65 72 20 68 75 72 74 73 20 74 6f 20 70 6c 61  ver hurts to pla
4000: 79 20 74 68 65 20 6f 64 64 73 29 2e 0a 20 20 2a  y the odds)..  *
4010: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
4020: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
4030: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
4040: 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  f( pSchema ){.  
4050: 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
4060: 53 28 69 3c 64 62 2d 3e 6e 44 62 29 3b 20 69 2b  S(i<db->nDb); i+
4070: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  +){.      if( db
4080: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
4090: 3d 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ==pSchema ){.   
40a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
40b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
40c0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
40d0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7d 0a 20  db->nDb );.  }. 
40e0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
40f0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65 20  .** Compile the 
4100: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51  UTF-8 encoded SQ
4110: 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a 53 71 6c  L statement zSql
4120: 20 69 6e 74 6f 20 61 20 73 74 61 74 65 6d 65 6e   into a statemen
4130: 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
4140: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50  tic int sqlite3P
4150: 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  repare(.  sqlite
4160: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
4170: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4180: 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e  handle. */.  con
4190: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
41a0: 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20         /* UTF-8 
41b0: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
41c0: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  ement. */.  int 
41d0: 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20  nBytes,         
41e0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
41f0: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
4200: 2e 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 53  . */.  int saveS
4210: 71 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  qlFlag,         
4220: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f 70 79   /* True to copy
4230: 20 53 51 4c 20 74 65 78 74 20 69 6e 74 6f 20 74   SQL text into t
4240: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  he sqlite3_stmt 
4250: 2a 2f 0a 20 20 56 64 62 65 20 2a 70 52 65 70 72  */.  Vdbe *pRepr
4260: 65 70 61 72 65 2c 20 20 20 20 20 20 20 20 20 2f  epare,         /
4270: 2a 20 56 4d 20 62 65 69 6e 67 20 72 65 70 72 65  * VM being repre
4280: 70 61 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pared */.  sqlit
4290: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
42a0: 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70  ,    /* OUT: A p
42b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
42c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
42d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
42e0: 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20   **pzTail       
42f0: 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70  /* OUT: End of p
4300: 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  arsed string */.
4310: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
4320: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
4330: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
4340: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  t */.  char *zEr
4350: 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
4360: 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
4370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
4380: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
4390: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
43a0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
43d0: 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
43e0: 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
43f0: 74 65 78 74 20 2a 2f 0a 20 20 70 50 61 72 73 65  text */.  pParse
4400: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
4410: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
4420: 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b 0a 20  eof(*pParse));. 
4430: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 29   if( pParse==0 )
4440: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
4450: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
4460: 6f 20 65 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20  o end_prepare;. 
4470: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 52 65   }.  pParse->pRe
4480: 70 72 65 70 61 72 65 20 3d 20 70 52 65 70 72 65  prepare = pRepre
4490: 70 61 72 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pare;.  assert( 
44a0: 70 70 53 74 6d 74 20 26 26 20 2a 70 70 53 74 6d  ppStmt && *ppStm
44b0: 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
44c0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
44d0: 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
44e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
44f0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
4500: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
4510: 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74 20   verify that it 
4520: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67  is possible to g
4530: 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  et a read lock o
4540: 6e 20 61 6c 6c 0a 20 20 2a 2a 20 64 61 74 61 62  n all.  ** datab
4550: 61 73 65 20 73 63 68 65 6d 61 73 2e 20 20 54 68  ase schemas.  Th
4560: 65 20 69 6e 61 62 69 6c 69 74 79 20 74 6f 20 67  e inability to g
4570: 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  et a read lock i
4580: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 20 20  ndicates that.  
4590: 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 61  ** some other da
45a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
45b0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 77  n is holding a w
45c0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 77 68 69 63 68  rite-lock, which
45d0: 20 69 6e 0a 20 20 2a 2a 20 74 75 72 6e 20 6d 65   in.  ** turn me
45e0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  ans that the oth
45f0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
4600: 73 20 6d 61 64 65 20 75 6e 63 6f 6d 6d 69 74 74  s made uncommitt
4610: 65 64 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ed changes.  ** 
4620: 74 6f 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 20  to the schema.. 
4630: 20 2a 2a 0a 20 20 2a 2a 20 57 65 72 65 20 77 65   **.  ** Were we
4640: 20 74 6f 20 70 72 6f 63 65 65 64 20 61 6e 64 20   to proceed and 
4650: 70 72 65 70 61 72 65 20 74 68 65 20 73 74 61 74  prepare the stat
4660: 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 74 68  ement against th
4670: 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a 20 20  e uncommitted.  
4680: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
4690: 73 20 61 6e 64 20 69 66 20 74 68 6f 73 65 20 73  s and if those s
46a0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
46b0: 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 72  e subsequently r
46c0: 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 20  olled.  ** back 
46d0: 61 6e 64 20 64 69 66 66 65 72 65 6e 74 20 63 68  and different ch
46e0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
46f0: 6e 20 74 68 65 69 72 20 70 6c 61 63 65 2c 20 74  n their place, t
4700: 68 65 6e 20 77 68 65 6e 20 74 68 69 73 0a 20 20  hen when this.  
4710: 2a 2a 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ** prepared stat
4720: 65 6d 65 6e 74 20 67 6f 65 73 20 74 6f 20 72 75  ement goes to ru
4730: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  n the schema coo
4740: 6b 69 65 20 77 6f 75 6c 64 20 66 61 69 6c 20 74  kie would fail t
4750: 6f 20 64 65 74 65 63 74 0a 20 20 2a 2a 20 74 68  o detect.  ** th
4760: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e  e schema change.
4770: 20 20 44 69 73 61 73 74 65 72 20 77 6f 75 6c 64    Disaster would
4780: 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2a 0a 20 20   follow..  **.  
4790: 2a 2a 20 54 68 69 73 20 74 68 72 65 61 64 20 69  ** This thread i
47a0: 73 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64  s currently hold
47b0: 69 6e 67 20 6d 75 74 65 78 65 73 20 6f 6e 20 61  ing mutexes on a
47c0: 6c 6c 20 42 74 72 65 65 73 20 28 62 65 63 61 75  ll Btrees (becau
47d0: 73 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  se.  ** of the s
47e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
47f0: 41 6c 6c 28 29 20 69 6e 20 73 71 6c 69 74 65 33  All() in sqlite3
4800: 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 29  LockAndPrepare()
4810: 29 20 73 6f 20 69 74 0a 20 20 2a 2a 20 69 73 20  ) so it.  ** is 
4820: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
4830: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
4840: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
4850: 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 20 20 2a  chema change.  *
4860: 2a 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75  * while this rou
4870: 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2e  tine is running.
4880: 20 20 48 65 6e 63 65 2c 20 77 65 20 64 6f 20 6e    Hence, we do n
4890: 6f 74 20 6e 65 65 64 20 74 6f 20 68 6f 6c 64 20  ot need to hold 
48a0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  .  ** locks on t
48b0: 68 65 20 73 63 68 65 6d 61 2c 20 77 65 20 6a 75  he schema, we ju
48c0: 73 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  st need to make 
48d0: 73 75 72 65 20 6e 6f 62 6f 64 79 20 65 6c 73 65  sure nobody else
48e0: 20 69 73 20 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   is .  ** holdin
48f0: 67 20 74 68 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  g them..  **.  *
4900: 2a 20 4e 6f 74 65 20 74 68 61 74 20 73 65 74 74  * Note that sett
4910: 69 6e 67 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  ing READ_UNCOMMI
4920: 54 54 45 44 20 6f 76 65 72 72 69 64 65 73 20 6d  TTED overrides m
4930: 6f 73 74 20 6c 6f 63 6b 20 64 65 74 65 63 74 69  ost lock detecti
4940: 6f 6e 2c 0a 20 20 2a 2a 20 62 75 74 20 69 74 20  on,.  ** but it 
4950: 64 6f 65 73 20 2a 6e 6f 74 2a 20 6f 76 65 72 72  does *not* overr
4960: 69 64 65 20 73 63 68 65 6d 61 20 6c 6f 63 6b 20  ide schema lock 
4970: 64 65 74 65 63 74 69 6f 6e 2c 20 73 6f 20 74 68  detection, so th
4980: 69 73 20 61 6c 6c 20 73 74 69 6c 6c 0a 20 20 2a  is all still.  *
4990: 2a 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  * works even if 
49a0: 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
49b0: 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
49c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
49d0: 44 62 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 42  Db; i++) {.    B
49e0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
49f0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
4a00: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
4a10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4a20: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4a30: 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
4a40: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4a50: 63 68 65 6d 61 4c 6f 63 6b 65 64 28 70 42 74 29  chemaLocked(pBt)
4a60: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
4a70: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
4a80: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
4a90: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  aDb[i].zName;.  
4aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4ab0: 6f 72 28 64 62 2c 20 72 63 2c 20 22 64 61 74 61  or(db, rc, "data
4ac0: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
4ad0: 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 44 62 29  ocked: %s", zDb)
4ae0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
4af0: 73 65 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  se( db->flags & 
4b00: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
4b10: 6d 69 74 74 65 64 20 29 3b 0a 20 20 20 20 20 20  mitted );.      
4b20: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70 61    goto end_prepa
4b30: 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
4b40: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
4b50: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
4b60: 62 29 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 64  b);..  pParse->d
4b70: 62 20 3d 20 64 62 3b 0a 20 20 70 50 61 72 73 65  b = db;.  pParse
4b80: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 28  ->nQueryLoop = (
4b90: 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20  double)1;.  if( 
4ba0: 6e 42 79 74 65 73 3e 3d 30 20 26 26 20 28 6e 42  nBytes>=0 && (nB
4bb0: 79 74 65 73 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  ytes==0 || zSql[
4bc0: 6e 42 79 74 65 73 2d 31 5d 21 3d 30 29 20 29 7b  nBytes-1]!=0) ){
4bd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 43  .    char *zSqlC
4be0: 6f 70 79 3b 0a 20 20 20 20 69 6e 74 20 6d 78 4c  opy;.    int mxL
4bf0: 65 6e 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  en = db->aLimit[
4c00: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
4c10: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 74 65  _LENGTH];.    te
4c20: 73 74 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d  stcase( nBytes==
4c30: 6d 78 4c 65 6e 20 29 3b 0a 20 20 20 20 74 65 73  mxLen );.    tes
4c40: 74 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d  tcase( nBytes==m
4c50: 78 4c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66  xLen+1 );.    if
4c60: 28 20 6e 42 79 74 65 73 3e 6d 78 4c 65 6e 20 29  ( nBytes>mxLen )
4c70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4c80: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
4c90: 54 4f 4f 42 49 47 2c 20 22 73 74 61 74 65 6d 65  TOOBIG, "stateme
4ca0: 6e 74 20 74 6f 6f 20 6c 6f 6e 67 22 29 3b 0a 20  nt too long");. 
4cb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4cc0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 53 51 4c  3ApiExit(db, SQL
4cd0: 49 54 45 5f 54 4f 4f 42 49 47 29 3b 0a 20 20 20  ITE_TOOBIG);.   
4ce0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70     goto end_prep
4cf0: 61 72 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  are;.    }.    z
4d00: 53 71 6c 43 6f 70 79 20 3d 20 73 71 6c 69 74 65  SqlCopy = sqlite
4d10: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a  3DbStrNDup(db, z
4d20: 53 71 6c 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20  Sql, nBytes);.  
4d30: 20 20 69 66 28 20 7a 53 71 6c 43 6f 70 79 20 29    if( zSqlCopy )
4d40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
4d50: 75 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c  unParser(pParse,
4d60: 20 7a 53 71 6c 43 6f 70 79 2c 20 26 7a 45 72 72   zSqlCopy, &zErr
4d70: 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
4d80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
4d90: 71 6c 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70  qlCopy);.      p
4da0: 50 61 72 73 65 2d 3e 7a 54 61 69 6c 20 3d 20 26  Parse->zTail = &
4db0: 7a 53 71 6c 5b 70 50 61 72 73 65 2d 3e 7a 54 61  zSql[pParse->zTa
4dc0: 69 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b 0a 20 20  il-zSqlCopy];.  
4dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
4de0: 50 61 72 73 65 2d 3e 7a 54 61 69 6c 20 3d 20 26  Parse->zTail = &
4df0: 7a 53 71 6c 5b 6e 42 79 74 65 73 5d 3b 0a 20 20  zSql[nBytes];.  
4e00: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4e10: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
4e20: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
4e30: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  &zErrMsg);.  }. 
4e40: 20 61 73 73 65 72 74 28 20 31 3d 3d 28 69 6e 74   assert( 1==(int
4e50: 29 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  )pParse->nQueryL
4e60: 6f 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 64 62  oop );..  if( db
4e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4e80: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
4e90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4ea0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
4eb0: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  e->rc==SQLITE_DO
4ec0: 4e 45 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20  NE ) pParse->rc 
4ed0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4ee0: 66 28 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b  f( pParse->check
4ef0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 63  Schema ){.    sc
4f00: 68 65 6d 61 49 73 56 61 6c 69 64 28 70 50 61 72  hemaIsValid(pPar
4f10: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
4f20: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
4f30: 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20 20  E_SCHEMA ){.    
4f40: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
4f50: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
4f60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  );.  }.  if( db-
4f70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4f80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
4f90: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4fa0: 20 20 7d 0a 20 20 69 66 28 20 70 7a 54 61 69 6c    }.  if( pzTail
4fb0: 20 29 7b 0a 20 20 20 20 2a 70 7a 54 61 69 6c 20   ){.    *pzTail 
4fc0: 3d 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 3b  = pParse->zTail;
4fd0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 50 61 72  .  }.  rc = pPar
4fe0: 73 65 2d 3e 72 63 3b 0a 0a 23 69 66 6e 64 65 66  se->rc;..#ifndef
4ff0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
5000: 4c 41 49 4e 0a 20 20 69 66 28 20 72 63 3d 3d 53  LAIN.  if( rc==S
5010: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72  QLITE_OK && pPar
5020: 73 65 2d 3e 70 56 64 62 65 20 26 26 20 70 50 61  se->pVdbe && pPa
5030: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
5040: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5050: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
5060: 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  ColName[] = {.  
5070: 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
5080: 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
5090: 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
50a0: 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 2c 0a  p5", "comment",.
50b0: 20 20 20 20 20 20 20 22 6f 72 64 65 72 22 2c 20         "order", 
50c0: 22 66 72 6f 6d 22 2c 20 22 64 65 74 61 69 6c 22  "from", "detail"
50d0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
50e0: 69 46 69 72 73 74 2c 20 6d 78 3b 0a 20 20 20 20  iFirst, mx;.    
50f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
5100: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ain==2 ){.      
5110: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
5120: 6d 43 6f 6c 73 28 70 50 61 72 73 65 2d 3e 70 56  mCols(pParse->pV
5130: 64 62 65 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  dbe, 3);.      i
5140: 46 69 72 73 74 20 3d 20 38 3b 0a 20 20 20 20 20  First = 8;.     
5150: 20 6d 78 20 3d 20 31 31 3b 0a 20 20 20 20 7d 65   mx = 11;.    }e
5160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5170: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
5180: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
5190: 38 29 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74  8);.      iFirst
51a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 78 20 3d   = 0;.      mx =
51b0: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   8;.    }.    fo
51c0: 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 6d 78  r(i=iFirst; i<mx
51d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
51e0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
51f0: 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ame(pParse->pVdb
5200: 65 2c 20 69 2d 69 46 69 72 73 74 2c 20 43 4f 4c  e, i-iFirst, COL
5210: 4e 41 4d 45 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  NAME_NAME,.     
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 20 20 61 7a 43 6f 6c 4e 61 6d 65         azColName
5240: 5b 69 5d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  [i], SQLITE_STAT
5250: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  IC);.    }.  }.#
5260: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
5270: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
5280: 30 20 7c 7c 20 73 61 76 65 53 71 6c 46 6c 61 67  0 || saveSqlFlag
5290: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
52a0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
52b0: 0a 20 20 20 20 56 64 62 65 20 2a 70 56 64 62 65  .    Vdbe *pVdbe
52c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
52d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
52e0: 65 53 65 74 53 71 6c 28 70 56 64 62 65 2c 20 7a  eSetSql(pVdbe, z
52f0: 53 71 6c 2c 20 28 69 6e 74 29 28 70 50 61 72 73  Sql, (int)(pPars
5300: 65 2d 3e 7a 54 61 69 6c 2d 7a 53 71 6c 29 2c 20  e->zTail-zSql), 
5310: 73 61 76 65 53 71 6c 46 6c 61 67 29 3b 0a 20 20  saveSqlFlag);.  
5320: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
5330: 70 56 64 62 65 20 26 26 20 28 72 63 21 3d 53 51  pVdbe && (rc!=SQ
5340: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e 6d  LITE_OK || db->m
5350: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
5360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
5370: 69 6e 61 6c 69 7a 65 28 70 50 61 72 73 65 2d 3e  inalize(pParse->
5380: 70 56 64 62 65 29 3b 0a 20 20 20 20 61 73 73 65  pVdbe);.    asse
5390: 72 74 28 21 28 2a 70 70 53 74 6d 74 29 29 3b 0a  rt(!(*ppStmt));.
53a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
53b0: 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f  Stmt = (sqlite3_
53c0: 73 74 6d 74 2a 29 70 50 61 72 73 65 2d 3e 70 56  stmt*)pParse->pV
53d0: 64 62 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dbe;.  }..  if( 
53e0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73  zErrMsg ){.    s
53f0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5400: 72 63 2c 20 22 25 73 22 2c 20 7a 45 72 72 4d 73  rc, "%s", zErrMs
5410: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
5420: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
5430: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
5440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
5450: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  , rc, 0);.  }.. 
5460: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 54   /* Delete any T
5470: 72 69 67 67 65 72 50 72 67 20 73 74 72 75 63 74  riggerPrg struct
5480: 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 77  ures allocated w
5490: 68 69 6c 65 20 70 61 72 73 69 6e 67 20 74 68 69  hile parsing thi
54a0: 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  s statement. */.
54b0: 20 20 77 68 69 6c 65 28 20 70 50 61 72 73 65 2d    while( pParse-
54c0: 3e 70 54 72 69 67 67 65 72 50 72 67 20 29 7b 0a  >pTriggerPrg ){.
54d0: 20 20 20 20 54 72 69 67 67 65 72 50 72 67 20 2a      TriggerPrg *
54e0: 70 54 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72  pT = pParse->pTr
54f0: 69 67 67 65 72 50 72 67 3b 0a 20 20 20 20 70 50  iggerPrg;.    pP
5500: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 50 72  arse->pTriggerPr
5510: 67 20 3d 20 70 54 2d 3e 70 4e 65 78 74 3b 0a 20  g = pT->pNext;. 
5520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
5530: 6f 67 72 61 6d 44 65 6c 65 74 65 28 64 62 2c 20  ogramDelete(db, 
5540: 70 54 2d 3e 70 50 72 6f 67 72 61 6d 2c 20 30 29  pT->pProgram, 0)
5550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
5560: 72 65 65 28 64 62 2c 20 70 54 29 3b 0a 20 20 7d  ree(db, pT);.  }
5570: 0a 0a 65 6e 64 5f 70 72 65 70 61 72 65 3a 0a 0a  ..end_prepare:..
5580: 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
5590: 65 65 28 64 62 2c 20 70 50 61 72 73 65 29 3b 0a  ee(db, pParse);.
55a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
55b0: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
55c0: 20 61 73 73 65 72 74 28 20 28 72 63 26 64 62 2d   assert( (rc&db-
55d0: 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
55e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
55f0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
5600: 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65  e3LockAndPrepare
5610: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5630: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
5640: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
5650: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
5660: 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   /* UTF-8 encode
5670: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
5680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   */.  int nBytes
5690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
56a0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
56b0: 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20  l in bytes. */. 
56c0: 20 69 6e 74 20 73 61 76 65 53 71 6c 46 6c 61 67   int saveSqlFlag
56d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ,          /* Tr
56e0: 75 65 20 74 6f 20 63 6f 70 79 20 53 51 4c 20 74  ue to copy SQL t
56f0: 65 78 74 20 69 6e 74 6f 20 74 68 65 20 73 71 6c  ext into the sql
5700: 69 74 65 33 5f 73 74 6d 74 20 2a 2f 0a 20 20 56  ite3_stmt */.  V
5710: 64 62 65 20 2a 70 4f 6c 64 2c 20 20 20 20 20 20  dbe *pOld,      
5720: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 62           /* VM b
5730: 65 69 6e 67 20 72 65 70 72 65 70 61 72 65 64 20  eing reprepared 
5740: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
5750: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f  t **ppStmt,    /
5760: 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72  * OUT: A pointer
5770: 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   to the prepared
5780: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
5790: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54  const char **pzT
57a0: 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ail       /* OUT
57b0: 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20  : End of parsed 
57c0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
57d0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
57e0: 20 70 70 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20   ppStmt!=0 );.  
57f0: 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
5800: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
5810: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
5820: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5830: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
5840: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
5850: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
5860: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
5870: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
5880: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
5890: 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c  repare(db, zSql,
58a0: 20 6e 42 79 74 65 73 2c 20 73 61 76 65 53 71 6c   nBytes, saveSql
58b0: 46 6c 61 67 2c 20 70 4f 6c 64 2c 20 70 70 53 74  Flag, pOld, ppSt
58c0: 6d 74 2c 20 70 7a 54 61 69 6c 29 3b 0a 20 20 69  mt, pzTail);.  i
58d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43  f( rc==SQLITE_SC
58e0: 48 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69  HEMA ){.    sqli
58f0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 2a 70 70  te3_finalize(*pp
5900: 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Stmt);.    rc = 
5910: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 28 64  sqlite3Prepare(d
5920: 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c  b, zSql, nBytes,
5930: 20 73 61 76 65 53 71 6c 46 6c 61 67 2c 20 70 4f   saveSqlFlag, pO
5940: 6c 64 2c 20 70 70 53 74 6d 74 2c 20 70 7a 54 61  ld, ppStmt, pzTa
5950: 69 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  il);.  }.  sqlit
5960: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
5970: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
5980: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
5990: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
59a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 72  rc;.}../*.** Rer
59b0: 75 6e 20 74 68 65 20 63 6f 6d 70 69 6c 61 74 69  un the compilati
59c0: 6f 6e 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  on of a statemen
59d0: 74 20 61 66 74 65 72 20 61 20 73 63 68 65 6d 61  t after a schema
59e0: 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   change..**.** I
59f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
5a00: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
5a10: 72 65 63 6f 6d 70 69 6c 65 64 2c 20 72 65 74 75  recompiled, retu
5a20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
5a30: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74  herwise,.** if t
5a40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
5a50: 6e 6f 74 20 62 65 20 72 65 63 6f 6d 70 69 6c 65  not be recompile
5a60: 64 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  d because anothe
5a70: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
5a80: 0a 2a 2a 20 6c 6f 63 6b 65 64 20 74 68 65 20 73  .** locked the s
5a90: 71 6c 69 74 65 33 5f 6d 61 73 74 65 72 20 74 61  qlite3_master ta
5aa0: 62 6c 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ble, return SQLI
5ab0: 54 45 5f 4c 4f 43 4b 45 44 2e 20 49 66 20 61 6e  TE_LOCKED. If an
5ac0: 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
5ad0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
5ae0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a  SQLITE_SCHEMA..*
5af0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 70  /.int sqlite3Rep
5b00: 72 65 70 61 72 65 28 56 64 62 65 20 2a 70 29 7b  repare(Vdbe *p){
5b10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
5b20: 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 77 3b  ite3_stmt *pNew;
5b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5b40: 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Sql;.  sqlite3 *
5b50: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  db;..  assert( s
5b60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5b70: 64 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  d(sqlite3VdbeDb(
5b80: 70 29 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  p)->mutex) );.  
5b90: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
5ba0: 71 6c 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  ql((sqlite3_stmt
5bb0: 20 2a 29 70 29 3b 0a 20 20 61 73 73 65 72 74 28   *)p);.  assert(
5bc0: 20 7a 53 71 6c 21 3d 30 20 29 3b 20 20 2f 2a 20   zSql!=0 );  /* 
5bd0: 52 65 70 72 65 70 61 72 65 20 6f 6e 6c 79 20 63  Reprepare only c
5be0: 61 6c 6c 65 64 20 66 6f 72 20 70 72 65 70 61 72  alled for prepar
5bf0: 65 5f 76 32 28 29 20 73 74 61 74 65 6d 65 6e 74  e_v2() statement
5c00: 73 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  s */.  db = sqli
5c10: 74 65 33 56 64 62 65 44 62 28 70 29 3b 0a 20 20  te3VdbeDb(p);.  
5c20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5c30: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
5c40: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
5c50: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
5c60: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
5c70: 2d 31 2c 20 30 2c 20 70 2c 20 26 70 4e 65 77 2c  -1, 0, p, &pNew,
5c80: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
5c90: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5ca0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
5cb0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
5cc0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  led = 1;.    }. 
5cd0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d     assert( pNew=
5ce0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
5cf0: 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
5d00: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
5d10: 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  0 );.  }.  sqlit
5d20: 65 33 56 64 62 65 53 77 61 70 28 28 56 64 62 65  e3VdbeSwap((Vdbe
5d30: 2a 29 70 4e 65 77 2c 20 70 29 3b 0a 20 20 73 71  *)pNew, p);.  sq
5d40: 6c 69 74 65 33 54 72 61 6e 73 66 65 72 42 69 6e  lite3TransferBin
5d50: 64 69 6e 67 73 28 70 4e 65 77 2c 20 28 73 71 6c  dings(pNew, (sql
5d60: 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 3b 0a 20  ite3_stmt*)p);. 
5d70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
5d80: 74 53 74 65 70 52 65 73 75 6c 74 28 28 56 64 62  tStepResult((Vdb
5d90: 65 2a 29 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69  e*)pNew);.  sqli
5da0: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
5db0: 28 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20  (Vdbe*)pNew);.  
5dc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5dd0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  ;.}.../*.** Two 
5de0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
5df0: 6f 66 66 69 63 69 61 6c 20 41 50 49 2e 20 20 4c  official API.  L
5e00: 65 67 61 63 79 20 61 6e 64 20 6e 65 77 20 75 73  egacy and new us
5e10: 65 2e 20 20 49 6e 20 74 68 65 20 6c 65 67 61 63  e.  In the legac
5e20: 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 74 68  y.** version, th
5e30: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5e40: 65 78 74 20 69 73 20 6e 6f 74 20 73 61 76 65 64  ext is not saved
5e50: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
5e60: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
5e70: 64 20 73 6f 20 69 66 20 61 20 73 63 68 65 6d 61  d so if a schema
5e80: 20 63 68 61 6e 67 65 20 6f 63 63 75 72 73 2c 20   change occurs, 
5e90: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 73  SQLITE_SCHEMA is
5ea0: 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20   returned by.** 
5eb0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
5ec0: 20 49 6e 20 74 68 65 20 6e 65 77 20 76 65 72 73   In the new vers
5ed0: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
5ee0: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 72 65  l SQL text is re
5ef0: 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68  tained.** and th
5f00: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  e statement is a
5f10: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65 63  utomatically rec
5f20: 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e 20 73 63  ompiled if an sc
5f30: 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a 2a 20 6f  hema change.** o
5f40: 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
5f50: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 0a 20  lite3_prepare(. 
5f60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5f80: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
5f90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5fa0: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  zSql,         /*
5fb0: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53   UTF-8 encoded S
5fc0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  QL statement. */
5fd0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20  .  int nBytes,  
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ff0: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
6000: 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71  n bytes. */.  sq
6010: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
6020: 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20  tmt,    /* OUT: 
6030: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
6040: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
6050: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
6060: 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20  har **pzTail    
6070: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f     /* OUT: End o
6080: 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20  f parsed string 
6090: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
60a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
60b0: 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c  ckAndPrepare(db,
60c0: 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 30 2c 30 2c  zSql,nBytes,0,0,
60d0: 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a  ppStmt,pzTail);.
60e0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
60f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d  LITE_OK || ppStm
6100: 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d  t==0 || *ppStmt=
6110: 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49 46 59  =0 );  /* VERIFY
6120: 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20 72 65  : F13021 */.  re
6130: 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
6140: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6150: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
6160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6170: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
6180: 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e. */.  const ch
6190: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
61a0: 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64    /* UTF-8 encod
61b0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
61c0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
61d0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
61e0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
61f0: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
6200: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6210: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
6220: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
6230: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
6240: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
6250: 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c  st char **pzTail
6260: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
6270: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
6280: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
6290: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
62a0: 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65  e3LockAndPrepare
62b0: 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c  (db,zSql,nBytes,
62c0: 31 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69  1,0,ppStmt,pzTai
62d0: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
62e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
62f0: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
6300: 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45  tmt==0 );  /* VE
6310: 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a  RIFY: F13021 */.
6320: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6330: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6340: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
6350: 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46   Compile the UTF
6360: 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20  -16 encoded SQL 
6370: 73 74 61 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69  statement zSql i
6380: 6e 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20  nto a statement 
6390: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
63a0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 72 65  c int sqlite3Pre
63b0: 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65  pare16(.  sqlite
63c0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
63d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
63e0: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
63f0: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
6400: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38          /* UTF-8
6410: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
6420: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  tement. */.  int
6430: 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20   nBytes,        
6440: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
6450: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
6460: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  s. */.  int save
6470: 53 71 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 20  SqlFlag,        
6480: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 61 76    /* True to sav
6490: 65 20 53 51 4c 20 74 65 78 74 20 69 6e 74 6f 20  e SQL text into 
64a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  the sqlite3_stmt
64b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
64c0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
64d0: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
64e0: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
64f0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
6500: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a   const void **pz
6510: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
6520: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
6530: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
6540: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
6550: 20 63 75 72 72 65 6e 74 6c 79 20 77 6f 72 6b 73   currently works
6560: 20 62 79 20 66 69 72 73 74 20 74 72 61 6e 73 66   by first transf
6570: 6f 72 6d 69 6e 67 20 74 68 65 20 55 54 46 2d 31  orming the UTF-1
6580: 36 0a 20 20 2a 2a 20 65 6e 63 6f 64 65 64 20 73  6.  ** encoded s
6590: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2c 20  tring to UTF-8, 
65a0: 74 68 65 6e 20 69 6e 76 6f 6b 69 6e 67 20 73 71  then invoking sq
65b0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e  lite3_prepare().
65c0: 20 54 68 65 0a 20 20 2a 2a 20 74 72 69 63 6b 79   The.  ** tricky
65d0: 20 62 69 74 20 69 73 20 66 69 67 75 72 69 6e 67   bit is figuring
65e0: 20 6f 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   out the pointer
65f0: 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70   to return in *p
6600: 7a 54 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 63 68  zTail..  */.  ch
6610: 61 72 20 2a 7a 53 71 6c 38 3b 0a 20 20 63 6f 6e  ar *zSql8;.  con
6620: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 38 20  st char *zTail8 
6630: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
6640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
6650: 73 65 72 74 28 20 70 70 53 74 6d 74 20 29 3b 0a  sert( ppStmt );.
6660: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
6670: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6680: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6690: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
66a0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
66b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
66c0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
66d0: 75 74 65 78 29 3b 0a 20 20 7a 53 71 6c 38 20 3d  utex);.  zSql8 =
66e0: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
66f0: 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65  (db, zSql, nByte
6700: 73 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  s, SQLITE_UTF16N
6710: 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 53  ATIVE);.  if( zS
6720: 71 6c 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ql8 ){.    rc = 
6730: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
6740: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 38 2c  epare(db, zSql8,
6750: 20 2d 31 2c 20 73 61 76 65 53 71 6c 46 6c 61 67   -1, saveSqlFlag
6760: 2c 20 30 2c 20 70 70 53 74 6d 74 2c 20 26 7a 54  , 0, ppStmt, &zT
6770: 61 69 6c 38 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ail8);.  }..  if
6780: 28 20 7a 54 61 69 6c 38 20 26 26 20 70 7a 54 61  ( zTail8 && pzTa
6790: 69 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  il ){.    /* If 
67a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
67b0: 72 65 74 75 72 6e 73 20 61 20 74 61 69 6c 20 70  returns a tail p
67c0: 6f 69 6e 74 65 72 2c 20 77 65 20 63 61 6c 63 75  ointer, we calcu
67d0: 6c 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  late the.    ** 
67e0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 69 6e 74  equivalent point
67f0: 65 72 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d  er into the UTF-
6800: 31 36 20 73 74 72 69 6e 67 20 62 79 20 63 6f 75  16 string by cou
6810: 6e 74 69 6e 67 20 74 68 65 20 75 6e 69 63 6f 64  nting the unicod
6820: 65 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74  e.    ** charact
6830: 65 72 73 20 62 65 74 77 65 65 6e 20 7a 53 71 6c  ers between zSql
6840: 38 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20 61 6e  8 and zTail8, an
6850: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 69 6e 67  d then returning
6860: 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a   a pointer.    *
6870: 2a 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  * the same numbe
6880: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
6890: 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31 36 20  into the UTF-16 
68a0: 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  string..    */. 
68b0: 20 20 20 69 6e 74 20 63 68 61 72 73 5f 70 61 72     int chars_par
68c0: 73 65 64 20 3d 20 73 71 6c 69 74 65 33 55 74 66  sed = sqlite3Utf
68d0: 38 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38 2c 20  8CharLen(zSql8, 
68e0: 28 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a 53 71  (int)(zTail8-zSq
68f0: 6c 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54 61 69  l8));.    *pzTai
6900: 6c 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c 20 2b  l = (u8 *)zSql +
6910: 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79 74   sqlite3Utf16Byt
6920: 65 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61 72 73  eLen(zSql, chars
6930: 5f 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a 20 20  _parsed);.  }.  
6940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6950: 2c 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72 63 20  , zSql8); .  rc 
6960: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
6970: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
6980: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6990: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
69a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
69b0: 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
69c0: 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20 41  f the official A
69d0: 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64 20  PI.  Legacy and 
69e0: 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68 65  new use.  In the
69f0: 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73 69   legacy.** versi
6a00: 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  on, the original
6a10: 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f 74   SQL text is not
6a20: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70 72   saved in the pr
6a30: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6a40: 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61 20  .** and so if a 
6a50: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f 63  schema change oc
6a60: 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43 48  curs, SQLITE_SCH
6a70: 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 20  EMA is returned 
6a80: 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74  by.** sqlite3_st
6a90: 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e 65  ep().  In the ne
6aa0: 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f  w version, the o
6ab0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
6ac0: 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a 20   is retained.** 
6ad0: 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  and the statemen
6ae0: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
6af0: 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69 66  ly recompiled if
6b00: 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e 67   an schema chang
6b10: 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  e.** occurs..*/.
6b20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70  int sqlite3_prep
6b30: 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65 33  are16(.  sqlite3
6b40: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
6b50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
6b60: 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e  andle. */ .  con
6b70: 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20 20  st void *zSql,  
6b80: 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20         /* UTF-8 
6b90: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
6ba0: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  ement. */.  int 
6bb0: 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20  nBytes,         
6bc0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6bd0: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
6be0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
6bf0: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
6c00: 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74   /* OUT: A point
6c10: 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  er to the prepar
6c20: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
6c30: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70    const void **p
6c40: 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f  zTail       /* O
6c50: 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65  UT: End of parse
6c60: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
6c70: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
6c80: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36  sqlite3Prepare16
6c90: 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c  (db,zSql,nBytes,
6ca0: 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29  0,ppStmt,pzTail)
6cb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
6cc0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53  SQLITE_OK || ppS
6cd0: 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d  tmt==0 || *ppStm
6ce0: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49  t==0 );  /* VERI
6cf0: 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20  FY: F13021 */.  
6d00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
6d10: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6d20: 31 36 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  16_v2(.  sqlite3
6d30: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
6d40: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
6d50: 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e  andle. */ .  con
6d60: 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20 20  st void *zSql,  
6d70: 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20         /* UTF-8 
6d80: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
6d90: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  ement. */.  int 
6da0: 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20  nBytes,         
6db0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6dc0: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
6dd0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
6de0: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
6df0: 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74   /* OUT: A point
6e00: 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  er to the prepar
6e10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
6e20: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70    const void **p
6e30: 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f  zTail       /* O
6e40: 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65  UT: End of parse
6e50: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
6e60: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
6e70: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36  sqlite3Prepare16
6e80: 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c  (db,zSql,nBytes,
6e90: 31 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29  1,ppStmt,pzTail)
6ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
6eb0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53  SQLITE_OK || ppS
6ec0: 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d  tmt==0 || *ppStm
6ed0: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49  t==0 );  /* VERI
6ee0: 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20  FY: F13021 */.  
6ef0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
6f00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6f10: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a           MIT_UTF16 */.