/ Hex Artifact Content
Login

Artifact cdd214500fd172578ba5672ccf4d1c1e7563db9b:


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 23 69 66 64 65 66 20 53 51 4c 49  t.h".#ifdef SQLI
0230: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a  TE_ENABLE_SQLRR.
0240: 23 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 72 72  # include "sqlrr
0250: 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h".#endif../*.*
0260: 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 69 74 44  * Fill the InitD
0270: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 77 69  ata structure wi
0280: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
0290: 61 67 65 20 74 68 61 74 20 69 6e 64 69 63 61 74  age that indicat
02a0: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 64  es.** that the d
02b0: 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
02c0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
02d0: 69 64 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61  id corruptSchema
02e0: 28 0a 20 20 49 6e 69 74 44 61 74 61 20 2a 70 44  (.  InitData *pD
02f0: 61 74 61 2c 20 20 20 20 20 2f 2a 20 49 6e 69 74  ata,     /* Init
0300: 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 74 65  ialization conte
0310: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
0320: 61 72 20 2a 7a 4f 62 6a 2c 20 20 20 20 2f 2a 20  ar *zObj,    /* 
0330: 4f 62 6a 65 63 74 20 62 65 69 6e 67 20 70 61 72  Object being par
0340: 73 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  sed at the point
0350: 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63   of error */.  c
0360: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74 72  onst char *zExtr
0370: 61 20 20 20 2f 2a 20 45 72 72 6f 72 20 69 6e 66  a   /* Error inf
0380: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  ormation */.){. 
0390: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
03a0: 44 61 74 61 2d 3e 64 62 3b 0a 20 20 69 66 28 20  Data->db;.  if( 
03b0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
03c0: 64 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  d && (db->flags 
03d0: 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
03e0: 79 4d 6f 64 65 29 3d 3d 30 20 29 7b 0a 20 20 20  yMode)==0 ){.   
03f0: 20 69 66 28 20 7a 4f 62 6a 3d 3d 30 20 29 20 7a   if( zObj==0 ) z
0400: 4f 62 6a 20 3d 20 22 3f 22 3b 0a 20 20 20 20 73  Obj = "?";.    s
0410: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
0420: 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d 73 67 2c  pData->pzErrMsg,
0430: 20 64 62 2c 0a 20 20 20 20 20 20 22 6d 61 6c 66   db,.      "malf
0440: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 73  ormed database s
0450: 63 68 65 6d 61 20 28 25 73 29 22 2c 20 7a 4f 62  chema (%s)", zOb
0460: 6a 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 74  j);.    if( zExt
0470: 72 61 20 29 7b 0a 20 20 20 20 20 20 2a 70 44 61  ra ){.      *pDa
0480: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 20 3d 20 73  ta->pzErrMsg = s
0490: 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
04a0: 62 2c 20 2a 70 44 61 74 61 2d 3e 70 7a 45 72 72  b, *pData->pzErr
04b0: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Msg, .          
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 20 20 20 20 20 20 22 25 73 20 2d 20 25 73 22         "%s - %s"
04e0: 2c 20 2a 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d  , *pData->pzErrM
04f0: 73 67 2c 20 7a 45 78 74 72 61 29 3b 0a 20 20 20  sg, zExtra);.   
0500: 20 7d 0a 20 20 7d 0a 20 20 70 44 61 74 61 2d 3e   }.  }.  pData->
0510: 72 63 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rc = db->mallocF
0520: 61 69 6c 65 64 20 3f 20 53 51 4c 49 54 45 5f 4e  ailed ? SQLITE_N
0530: 4f 4d 45 4d 20 3a 20 53 51 4c 49 54 45 5f 43 4f  OMEM : SQLITE_CO
0540: 52 52 55 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  RRUPT;.}../*.** 
0550: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
0560: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72  back routine for
0570: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 69   the code that i
0580: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 0a 2a  nitializes the.*
0590: 2a 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  * database.  See
05a0: 20 73 71 6c 69 74 65 33 49 6e 69 74 28 29 20 62   sqlite3Init() b
05b0: 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f  elow for additio
05c0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
05d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
05e0: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
05f0: 66 72 6f 6d 20 74 68 65 20 4f 50 5f 50 61 72 73  from the OP_Pars
0600: 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 20 6f  eSchema opcode o
0610: 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a  f the VDBE..**.*
0620: 2a 20 45 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  * Each callback 
0630: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c  contains the fol
0640: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
0650: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72  on:.**.**     ar
0660: 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20  gv[0] = name of 
0670: 74 68 69 6e 67 20 62 65 69 6e 67 20 63 72 65 61  thing being crea
0680: 74 65 64 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  ted.**     argv[
0690: 31 5d 20 3d 20 72 6f 6f 74 20 70 61 67 65 20 6e  1] = root page n
06a0: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
06b0: 6f 72 20 69 6e 64 65 78 2e 20 30 20 66 6f 72 20  or index. 0 for 
06c0: 74 72 69 67 67 65 72 20 6f 72 20 76 69 65 77 2e  trigger or view.
06d0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20  .**     argv[2] 
06e0: 3d 20 53 51 4c 20 74 65 78 74 20 66 6f 72 20 74  = SQL text for t
06f0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
0700: 65 6e 74 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  ent..**.*/.int s
0710: 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61  qlite3InitCallba
0720: 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74 2c 20  ck(void *pInit, 
0730: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
0740: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f  *argv, char **No
0750: 74 55 73 65 64 29 7b 0a 20 20 49 6e 69 74 44 61  tUsed){.  InitDa
0760: 74 61 20 2a 70 44 61 74 61 20 3d 20 28 49 6e 69  ta *pData = (Ini
0770: 74 44 61 74 61 2a 29 70 49 6e 69 74 3b 0a 20 20  tData*)pInit;.  
0780: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44  sqlite3 *db = pD
0790: 61 74 61 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  ata->db;.  int i
07a0: 44 62 20 3d 20 70 44 61 74 61 2d 3e 69 44 62 3b  Db = pData->iDb;
07b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
07c0: 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==3 );.  UNUSED_
07d0: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
07e0: 65 64 2c 20 61 72 67 63 29 3b 0a 20 20 61 73 73  ed, argc);.  ass
07f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
0800: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
0810: 78 29 20 29 3b 0a 20 20 44 62 43 6c 65 61 72 50  x) );.  DbClearP
0820: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
0830: 20 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20 69 66   DB_Empty);.  if
0840: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0850: 65 64 20 29 7b 0a 20 20 20 20 63 6f 72 72 75 70  ed ){.    corrup
0860: 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61  tSchema(pData, a
0870: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  rgv[0], 0);.    
0880: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
0890: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
08a0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
08b0: 3b 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30 20  ;.  if( argv==0 
08c0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
08d0: 20 4d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   Might happen if
08e0: 20 45 4d 50 54 59 5f 52 45 53 55 4c 54 5f 43 41   EMPTY_RESULT_CA
08f0: 4c 4c 42 41 43 4b 53 20 61 72 65 20 6f 6e 20 2a  LLBACKS are on *
0900: 2f 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 3d  /.  if( argv[1]=
0910: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 72 72 75 70  =0 ){.    corrup
0920: 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61  tSchema(pData, a
0930: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  rgv[0], 0);.  }e
0940: 6c 73 65 20 69 66 28 20 61 72 67 76 5b 32 5d 20  lse if( argv[2] 
0950: 26 26 20 61 72 67 76 5b 32 5d 5b 30 5d 20 29 7b  && argv[2][0] ){
0960: 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  .    /* Call the
0970: 20 70 61 72 73 65 72 20 74 6f 20 70 72 6f 63 65   parser to proce
0980: 73 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ss a CREATE TABL
0990: 45 2c 20 49 4e 44 45 58 20 6f 72 20 56 49 45 57  E, INDEX or VIEW
09a0: 2e 0a 20 20 20 20 2a 2a 20 42 75 74 20 62 65 63  ..    ** But bec
09b0: 61 75 73 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ause db->init.bu
09c0: 73 79 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  sy is set to 1, 
09d0: 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 69 73 20  no VDBE code is 
09e0: 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a  generated.    **
09f0: 20 6f 72 20 65 78 65 63 75 74 65 64 2e 20 20 41   or executed.  A
0a00: 6c 6c 20 74 68 65 20 70 61 72 73 65 72 20 64 6f  ll the parser do
0a10: 65 73 20 69 73 20 62 75 69 6c 64 20 74 68 65 20  es is build the 
0a20: 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 0a 20 20  internal data.  
0a30: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20    ** structures 
0a40: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
0a50: 65 20 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20  e table, index, 
0a60: 6f 72 20 76 69 65 77 2e 0a 20 20 20 20 2a 2f 0a  or view..    */.
0a70: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
0a80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0a90: 74 6d 74 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c  tmt;.    TESTONL
0aa0: 59 28 69 6e 74 20 72 63 70 29 3b 20 20 20 20 20  Y(int rcp);     
0ab0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0ac0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
0ad0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
0ae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
0af0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
0b00: 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
0b10: 20 69 44 62 3b 0a 20 20 20 20 64 62 2d 3e 69 6e   iDb;.    db->in
0b20: 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 73 71 6c  it.newTnum = sql
0b30: 69 74 65 33 41 74 6f 69 28 61 72 67 76 5b 31 5d  ite3Atoi(argv[1]
0b40: 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  );.    db->init.
0b50: 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d 20  orphanTrigger = 
0b60: 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59 28  0;.    TESTONLY(
0b70: 72 63 70 20 3d 20 29 20 73 71 6c 69 74 65 33 5f  rcp = ) sqlite3_
0b80: 70 72 65 70 61 72 65 28 64 62 2c 20 61 72 67 76  prepare(db, argv
0b90: 5b 32 5d 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  [2], -1, &pStmt,
0ba0: 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
0bb0: 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 61  ->errCode;.    a
0bc0: 73 73 65 72 74 28 20 28 72 63 26 30 78 46 46 29  ssert( (rc&0xFF)
0bd0: 3d 3d 28 72 63 70 26 30 78 46 46 29 20 29 3b 0a  ==(rcp&0xFF) );.
0be0: 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62      db->init.iDb
0bf0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 53 51   = 0;.    if( SQ
0c00: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
0c10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69       if( db->ini
0c20: 74 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20  t.orphanTrigger 
0c30: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
0c40: 74 28 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  t( iDb==1 );.   
0c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0c60: 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 72 63    pData->rc = rc
0c70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
0c80: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
0c90: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
0ca0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
0cb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
0cc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  if( rc!=SQLITE_I
0cd0: 4e 54 45 52 52 55 50 54 20 26 26 20 28 72 63 26  NTERRUPT && (rc&
0ce0: 30 78 46 46 29 21 3d 53 51 4c 49 54 45 5f 4c 4f  0xFF)!=SQLITE_LO
0cf0: 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  CKED ){.        
0d00: 20 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28    corruptSchema(
0d10: 70 44 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20  pData, argv[0], 
0d20: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
0d30: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  b));.        }. 
0d40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
0d50: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0d60: 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  e(pStmt);.  }els
0d70: 65 20 69 66 28 20 61 72 67 76 5b 30 5d 3d 3d 30  e if( argv[0]==0
0d80: 20 29 7b 0a 20 20 20 20 63 6f 72 72 75 70 74 53   ){.    corruptS
0d90: 63 68 65 6d 61 28 70 44 61 74 61 2c 20 30 2c 20  chema(pData, 0, 
0da0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
0db0: 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 20 63   /* If the SQL c
0dc0: 6f 6c 75 6d 6e 20 69 73 20 62 6c 61 6e 6b 20 69  olumn is blank i
0dd0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20  t means this is 
0de0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 0a 20 20  an index that.  
0df0: 20 20 2a 2a 20 77 61 73 20 63 72 65 61 74 65 64    ** was created
0e00: 20 74 6f 20 62 65 20 74 68 65 20 50 52 49 4d 41   to be the PRIMA
0e10: 52 59 20 4b 45 59 20 6f 72 20 74 6f 20 66 75 6c  RY KEY or to ful
0e20: 66 69 6c 6c 20 61 20 55 4e 49 51 55 45 0a 20 20  fill a UNIQUE.  
0e30: 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
0e40: 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42  for a CREATE TAB
0e50: 4c 45 2e 20 20 54 68 65 20 69 6e 64 65 78 20 73  LE.  The index s
0e60: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
0e70: 64 79 0a 20 20 20 20 2a 2a 20 62 65 65 6e 20 63  dy.    ** been c
0e80: 72 65 61 74 65 64 20 77 68 65 6e 20 77 65 20 70  reated when we p
0e90: 72 6f 63 65 73 73 65 64 20 74 68 65 20 43 52 45  rocessed the CRE
0ea0: 41 54 45 20 54 41 42 4c 45 2e 20 20 41 6c 6c 20  ATE TABLE.  All 
0eb0: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
0ec0: 6f 20 64 6f 20 68 65 72 65 20 69 73 20 72 65 63  o do here is rec
0ed0: 6f 72 64 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ord the root pag
0ee0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 61  e number for tha
0ef0: 74 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  t index..    */.
0f00: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
0f10: 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
0f20: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
0f30: 28 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 64 62  (db, argv[0], db
0f40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
0f50: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
0f60: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  x==0 ){.      /*
0f70: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20   This can occur 
0f80: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
0f90: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 61 20 54 45  an index on a TE
0fa0: 4d 50 20 74 61 62 6c 65 20 77 68 69 63 68 0a 20  MP table which. 
0fb0: 20 20 20 20 20 2a 2a 20 68 61 73 20 74 68 65 20       ** has the 
0fc0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 61 6e 6f  same name as ano
0fd0: 74 68 65 72 20 69 6e 64 65 78 20 6f 6e 20 61 20  ther index on a 
0fe0: 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 65 78 2e  permanent index.
0ff0: 20 20 53 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a    Since.      **
1000: 20 74 68 65 20 70 65 72 6d 61 6e 65 6e 74 20 74   the permanent t
1010: 61 62 6c 65 20 69 73 20 68 69 64 64 65 6e 20 62  able is hidden b
1020: 79 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65  y the TEMP table
1030: 2c 20 77 65 20 63 61 6e 20 61 6c 73 6f 0a 20 20  , we can also.  
1040: 20 20 20 20 2a 2a 20 73 61 66 65 6c 79 20 69 67      ** safely ig
1050: 6e 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 6f  nore the index o
1060: 6e 20 74 68 65 20 70 65 72 6d 61 6e 65 6e 74 20  n the permanent 
1070: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
1080: 20 20 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68        /* Do Noth
1090: 69 6e 67 20 2a 2f 3b 0a 20 20 20 20 7d 65 6c 73  ing */;.    }els
10a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74  e if( sqlite3Get
10b0: 49 6e 74 33 32 28 61 72 67 76 5b 31 5d 2c 20 26  Int32(argv[1], &
10c0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3d 3d 30  pIndex->tnum)==0
10d0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 72 72 75 70   ){.      corrup
10e0: 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61  tSchema(pData, a
10f0: 72 67 76 5b 30 5d 2c 20 22 69 6e 76 61 6c 69 64  rgv[0], "invalid
1100: 20 72 6f 6f 74 70 61 67 65 22 29 3b 0a 20 20 20   rootpage");.   
1110: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1120: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  0;.}../*.** Atte
1130: 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 20  mpt to read the 
1140: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1150: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
1160: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  nternal.** data 
1170: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 61  structures for a
1180: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1190: 20 66 69 6c 65 2e 20 20 54 68 65 20 69 6e 64 65   file.  The inde
11a0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
11b0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69 76  base file is giv
11c0: 65 6e 20 62 79 20 69 44 62 2e 20 20 69 44 62 3d  en by iDb.  iDb=
11d0: 3d 30 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  =0 is used for t
11e0: 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 61 74 61 62  he main.** datab
11f0: 61 73 65 2e 20 20 69 44 62 3d 3d 31 20 73 68 6f  ase.  iDb==1 sho
1200: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 75 73 65  uld never be use
1210: 64 2e 20 20 69 44 62 3e 3d 32 20 69 73 20 75 73  d.  iDb>=2 is us
1220: 65 64 20 66 6f 72 0a 2a 2a 20 61 75 78 69 6c 69  ed for.** auxili
1230: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  ary databases.  
1240: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  Return one of th
1250: 65 20 53 51 4c 49 54 45 5f 20 65 72 72 6f 72 20  e SQLITE_ error 
1260: 63 6f 64 65 73 20 74 6f 0a 2a 2a 20 69 6e 64 69  codes to.** indi
1270: 63 61 74 65 20 73 75 63 63 65 73 73 20 6f 72 20  cate success or 
1280: 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1290: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
12a0: 69 74 4f 6e 65 28 73 71 6c 69 74 65 33 20 2a 64  itOne(sqlite3 *d
12b0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  b, int iDb, char
12c0: 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20   **pzErrMsg){.  
12d0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b  int rc;.  int i;
12e0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 54  .  int size;.  T
12f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 44 62  able *pTab;.  Db
1300: 20 2a 70 44 62 3b 0a 20 20 63 68 61 72 20 63 6f   *pDb;.  char co
1310: 6e 73 74 20 2a 61 7a 41 72 67 5b 34 5d 3b 0a 20  nst *azArg[4];. 
1320: 20 69 6e 74 20 6d 65 74 61 5b 35 5d 3b 0a 20 20   int meta[5];.  
1330: 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74  InitData initDat
1340: 61 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  a;.  char const 
1350: 2a 7a 4d 61 73 74 65 72 53 63 68 65 6d 61 3b 0a  *zMasterSchema;.
1360: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
1370: 61 73 74 65 72 4e 61 6d 65 3b 0a 20 20 69 6e 74  asterName;.  int
1380: 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69   openedTransacti
1390: 6f 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20  on = 0;..  /*.  
13a0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 64 61  ** The master da
13b0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 68 61 73  tabase table has
13c0: 20 61 20 73 74 72 75 63 74 75 72 65 20 6c 69 6b   a structure lik
13d0: 65 20 74 68 69 73 0a 20 20 2a 2f 0a 20 20 73 74  e this.  */.  st
13e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13f0: 6d 61 73 74 65 72 5f 73 63 68 65 6d 61 5b 5d 20  master_schema[] 
1400: 3d 20 0a 20 20 20 20 20 22 43 52 45 41 54 45 20  = .     "CREATE 
1410: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73  TABLE sqlite_mas
1420: 74 65 72 28 5c 6e 22 0a 20 20 20 20 20 22 20 20  ter(\n".     "  
1430: 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
1440: 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c     "  name text,
1450: 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 62 6c 5f  \n".     "  tbl_
1460: 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
1470: 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69     "  rootpage i
1480: 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20  nteger,\n".     
1490: 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
14a0: 20 20 20 20 22 29 22 0a 20 20 3b 0a 23 69 66 6e      ")".  ;.#ifn
14b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14c0: 54 45 4d 50 44 42 0a 20 20 73 74 61 74 69 63 20  TEMPDB.  static 
14d0: 63 6f 6e 73 74 20 63 68 61 72 20 74 65 6d 70 5f  const char temp_
14e0: 6d 61 73 74 65 72 5f 73 63 68 65 6d 61 5b 5d 20  master_schema[] 
14f0: 3d 20 0a 20 20 20 20 20 22 43 52 45 41 54 45 20  = .     "CREATE 
1500: 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74  TEMP TABLE sqlit
1510: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 28 5c 6e  e_temp_master(\n
1520: 22 0a 20 20 20 20 20 22 20 20 74 79 70 65 20 74  ".     "  type t
1530: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ext,\n".     "  
1540: 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
1550: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
1560: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ext,\n".     "  
1570: 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72  rootpage integer
1580: 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 73 71 6c  ,\n".     "  sql
1590: 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 22 29   text\n".     ")
15a0: 22 0a 20 20 3b 0a 23 65 6c 73 65 0a 20 20 23 64  ".  ;.#else.  #d
15b0: 65 66 69 6e 65 20 74 65 6d 70 5f 6d 61 73 74 65  efine temp_maste
15c0: 72 5f 73 63 68 65 6d 61 20 30 0a 23 65 6e 64 69  r_schema 0.#endi
15d0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  f..  assert( iDb
15e0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
15f0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
1600: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1610: 68 65 6d 61 20 29 3b 0a 20 20 61 73 73 65 72 74  hema );.  assert
1620: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1630: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1640: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
1650: 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  ==1 || sqlite3Bt
1660: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62  reeHoldsMutex(db
1670: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20  ->aDb[iDb].pBt) 
1680: 29 3b 0a 0a 20 20 2f 2a 20 7a 4d 61 73 74 65 72  );..  /* zMaster
1690: 53 63 68 65 6d 61 20 61 6e 64 20 7a 49 6e 69 74  Schema and zInit
16a0: 53 63 72 69 70 74 20 61 72 65 20 73 65 74 20 74  Script are set t
16b0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
16c0: 61 73 74 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  aster schema.  *
16d0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 73 61  * and initialisa
16e0: 74 69 6f 6e 20 73 63 72 69 70 74 20 61 70 70 72  tion script appr
16f0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
1700: 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 0a 20  database being. 
1710: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 73 65 64 2e   ** initialised.
1720: 20 7a 4d 61 73 74 65 72 4e 61 6d 65 20 69 73 20   zMasterName is 
1730: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1740: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
1750: 2a 2f 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  */.  if( !OMIT_T
1760: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1770: 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 53 63  ){.    zMasterSc
1780: 68 65 6d 61 20 3d 20 74 65 6d 70 5f 6d 61 73 74  hema = temp_mast
1790: 65 72 5f 73 63 68 65 6d 61 3b 0a 20 20 7d 65 6c  er_schema;.  }el
17a0: 73 65 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 53  se{.    zMasterS
17b0: 63 68 65 6d 61 20 3d 20 6d 61 73 74 65 72 5f 73  chema = master_s
17c0: 63 68 65 6d 61 3b 0a 20 20 7d 0a 20 20 7a 4d 61  chema;.  }.  zMa
17d0: 73 74 65 72 4e 61 6d 65 20 3d 20 53 43 48 45 4d  sterName = SCHEM
17e0: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 0a 20  A_TABLE(iDb);.. 
17f0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
1800: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 2e  e schema tables.
1810: 20 20 2a 2f 0a 20 20 61 7a 41 72 67 5b 30 5d 20    */.  azArg[0] 
1820: 3d 20 7a 4d 61 73 74 65 72 4e 61 6d 65 3b 0a 20  = zMasterName;. 
1830: 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22 31 22 3b   azArg[1] = "1";
1840: 0a 20 20 61 7a 41 72 67 5b 32 5d 20 3d 20 7a 4d  .  azArg[2] = zM
1850: 61 73 74 65 72 53 63 68 65 6d 61 3b 0a 20 20 61  asterSchema;.  a
1860: 7a 41 72 67 5b 33 5d 20 3d 20 30 3b 0a 20 20 69  zArg[3] = 0;.  i
1870: 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b  nitData.db = db;
1880: 0a 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20  .  initData.iDb 
1890: 3d 20 69 44 62 3b 0a 20 20 69 6e 69 74 44 61 74  = iDb;.  initDat
18a0: 61 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  a.rc = SQLITE_OK
18b0: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45  ;.  initData.pzE
18c0: 72 72 4d 73 67 20 3d 20 70 7a 45 72 72 4d 73 67  rrMsg = pzErrMsg
18d0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 69 74 43  ;.  sqlite3InitC
18e0: 61 6c 6c 62 61 63 6b 28 26 69 6e 69 74 44 61 74  allback(&initDat
18f0: 61 2c 20 33 2c 20 28 63 68 61 72 20 2a 2a 29 61  a, 3, (char **)a
1900: 7a 41 72 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  zArg, 0);.  if( 
1910: 69 6e 69 74 44 61 74 61 2e 72 63 20 29 7b 0a 20  initData.rc ){. 
1920: 20 20 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61     rc = initData
1930: 2e 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  .rc;.    goto er
1940: 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  ror_out;.  }.  p
1950: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1960: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4d 61 73 74  dTable(db, zMast
1970: 65 72 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b  erName, db->aDb[
1980: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69  iDb].zName);.  i
1990: 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 29 20  f( ALWAYS(pTab) 
19a0: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
19b0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64  Flags |= TF_Read
19c0: 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  only;.  }..  /* 
19d0: 43 72 65 61 74 65 20 61 20 63 75 72 73 6f 72 20  Create a cursor 
19e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61  to hold the data
19f0: 62 61 73 65 20 6f 70 65 6e 0a 20 20 2a 2f 0a 20  base open.  */. 
1a00: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
1a10: 69 44 62 5d 3b 0a 20 20 69 66 28 20 70 44 62 2d  iDb];.  if( pDb-
1a20: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  >pBt==0 ){.    i
1a30: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1a40: 26 26 20 41 4c 57 41 59 53 28 69 44 62 3d 3d 31  && ALWAYS(iDb==1
1a50: 29 20 29 7b 0a 20 20 20 20 20 20 44 62 53 65 74  ) ){.      DbSet
1a60: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20  Property(db, 1, 
1a70: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1a90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1aa0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
1ab0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1ac0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f 72 20  a read-only (or 
1ad0: 72 65 61 64 2d 77 72 69 74 65 29 20 74 72 61 6e  read-write) tran
1ae0: 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 0a 20  saction opened. 
1af0: 20 2a 2a 20 6f 6e 20 74 68 65 20 62 2d 74 72 65   ** on the b-tre
1b00: 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70 65 6e  e database, open
1b10: 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61 20 74   one now. If a t
1b20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
1b30: 65 6e 65 64 2c 20 69 74 20 0a 20 20 2a 2a 20 77  ened, it .  ** w
1b40: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 64 20 62 65  ill be closed be
1b50: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1b60: 6f 6e 20 72 65 74 75 72 6e 73 2e 20 20 2a 2f 0a  on returns.  */.
1b70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b80: 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ter(pDb->pBt);. 
1b90: 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72   if( !sqlite3Btr
1ba0: 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
1bb0: 70 44 62 2d 3e 70 42 74 29 20 29 7b 0a 20 20 20  pDb->pBt) ){.   
1bc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1bd0: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 44 62  eeBeginTrans(pDb
1be0: 2d 3e 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 69  ->pBt, 0);.    i
1bf0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c10: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
1c20: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
1c30: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
1c40: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 69 6e  );.      goto in
1c50: 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b  itone_error_out;
1c60: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 65  .    }.    opene
1c70: 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 31  dTransaction = 1
1c80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
1c90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 65 74  the database met
1ca0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  a information.. 
1cb0: 20 2a 2a 0a 20 20 2a 2a 20 4d 65 74 61 20 76 61   **.  ** Meta va
1cc0: 6c 75 65 73 20 61 72 65 20 61 73 20 66 6f 6c 6c  lues are as foll
1cd0: 6f 77 73 3a 0a 20 20 2a 2a 20 20 20 20 6d 65 74  ows:.  **    met
1ce0: 61 5b 30 5d 20 20 20 53 63 68 65 6d 61 20 63 6f  a[0]   Schema co
1cf0: 6f 6b 69 65 2e 20 20 43 68 61 6e 67 65 73 20 77  okie.  Changes w
1d00: 69 74 68 20 65 61 63 68 20 73 63 68 65 6d 61 20  ith each schema 
1d10: 63 68 61 6e 67 65 2e 0a 20 20 2a 2a 20 20 20 20  change..  **    
1d20: 6d 65 74 61 5b 31 5d 20 20 20 46 69 6c 65 20 66  meta[1]   File f
1d30: 6f 72 6d 61 74 20 6f 66 20 73 63 68 65 6d 61 20  ormat of schema 
1d40: 6c 61 79 65 72 2e 0a 20 20 2a 2a 20 20 20 20 6d  layer..  **    m
1d50: 65 74 61 5b 32 5d 20 20 20 53 69 7a 65 20 6f 66  eta[2]   Size of
1d60: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1d70: 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 33 5d  .  **    meta[3]
1d80: 20 20 20 4c 61 72 67 65 73 74 20 72 6f 6f 74 70     Largest rootp
1d90: 61 67 65 20 28 61 75 74 6f 2f 69 6e 63 72 5f 76  age (auto/incr_v
1da0: 61 63 75 75 6d 20 6d 6f 64 65 29 0a 20 20 2a 2a  acuum mode).  **
1db0: 20 20 20 20 6d 65 74 61 5b 34 5d 20 20 20 44 62      meta[4]   Db
1dc0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20   text encoding. 
1dd0: 31 3a 55 54 46 2d 38 20 32 3a 55 54 46 2d 31 36  1:UTF-8 2:UTF-16
1de0: 4c 45 20 33 3a 55 54 46 2d 31 36 42 45 0a 20 20  LE 3:UTF-16BE.  
1df0: 2a 2a 20 20 20 20 6d 65 74 61 5b 35 5d 20 20 20  **    meta[5]   
1e00: 55 73 65 72 20 76 65 72 73 69 6f 6e 0a 20 20 2a  User version.  *
1e10: 2a 20 20 20 20 6d 65 74 61 5b 36 5d 20 20 20 49  *    meta[6]   I
1e20: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1e30: 6d 20 6d 6f 64 65 0a 20 20 2a 2a 20 20 20 20 6d  m mode.  **    m
1e40: 65 74 61 5b 37 5d 20 20 20 75 6e 75 73 65 64 0a  eta[7]   unused.
1e50: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 38 5d 20    **    meta[8] 
1e60: 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20    unused.  **   
1e70: 20 6d 65 74 61 5b 39 5d 20 20 20 75 6e 75 73 65   meta[9]   unuse
1e80: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  d.  **.  ** Note
1e90: 3a 20 54 68 65 20 23 64 65 66 69 6e 65 64 20 53  : The #defined S
1ea0: 51 4c 49 54 45 5f 55 54 46 2a 20 73 79 6d 62 6f  QLITE_UTF* symbo
1eb0: 6c 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ls in sqliteInt.
1ec0: 68 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a  h correspond to.
1ed0: 20 20 2a 2a 20 74 68 65 20 70 6f 73 73 69 62 6c    ** the possibl
1ee0: 65 20 76 61 6c 75 65 73 20 6f 66 20 6d 65 74 61  e values of meta
1ef0: 5b 34 5d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  [4]..  */.  for(
1f00: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1f10: 28 6d 65 74 61 29 3b 20 69 2b 2b 29 7b 0a 20 20  (meta); i++){.  
1f20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
1f30: 74 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20  tMeta(pDb->pBt, 
1f40: 69 2b 31 2c 20 28 75 33 32 20 2a 29 26 6d 65 74  i+1, (u32 *)&met
1f50: 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 44 62  a[i]);.  }.  pDb
1f60: 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
1f70: 61 5f 63 6f 6f 6b 69 65 20 3d 20 6d 65 74 61 5b  a_cookie = meta[
1f80: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
1f90: 53 49 4f 4e 2d 31 5d 3b 0a 0a 20 20 2f 2a 20 49  SION-1];..  /* I
1fa0: 66 20 6f 70 65 6e 69 6e 67 20 61 20 6e 6f 6e 2d  f opening a non-
1fb0: 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1fc0: 63 68 65 63 6b 20 74 68 65 20 74 65 78 74 20 65  check the text e
1fd0: 6e 63 6f 64 69 6e 67 2e 20 46 6f 72 20 74 68 65  ncoding. For the
1fe0: 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62  .  ** main datab
1ff0: 61 73 65 2c 20 73 65 74 20 73 71 6c 69 74 65 33  ase, set sqlite3
2000: 2e 65 6e 63 20 74 6f 20 74 68 65 20 65 6e 63 6f  .enc to the enco
2010: 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e  ding of the main
2020: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20   database..  ** 
2030: 46 6f 72 20 61 6e 20 61 74 74 61 63 68 65 64 20  For an attached 
2040: 64 62 2c 20 69 74 20 69 73 20 61 6e 20 65 72 72  db, it is an err
2050: 6f 72 20 69 66 20 74 68 65 20 65 6e 63 6f 64 69  or if the encodi
2060: 6e 67 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  ng is not the sa
2070: 6d 65 0a 20 20 2a 2a 20 61 73 20 73 71 6c 69 74  me.  ** as sqlit
2080: 65 33 2e 65 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69  e3.enc..  */.  i
2090: 66 28 20 6d 65 74 61 5b 42 54 52 45 45 5f 54 45  f( meta[BTREE_TE
20a0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 20 29  XT_ENCODING-1] )
20b0: 7b 20 20 2f 2a 20 74 65 78 74 20 65 6e 63 6f 64  {  /* text encod
20c0: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ing */.    if( i
20d0: 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  Db==0 ){.      u
20e0: 38 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20  8 encoding;.    
20f0: 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20    /* If opening 
2100: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2110: 65 2c 20 73 65 74 20 45 4e 43 28 64 62 29 2e 20  e, set ENC(db). 
2120: 2a 2f 0a 20 20 20 20 20 20 65 6e 63 6f 64 69 6e  */.      encodin
2130: 67 20 3d 20 28 75 38 29 6d 65 74 61 5b 42 54 52  g = (u8)meta[BTR
2140: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
2150: 2d 31 5d 20 26 20 33 3b 0a 20 20 20 20 20 20 69  -1] & 3;.      i
2160: 66 28 20 65 6e 63 6f 64 69 6e 67 3d 3d 30 20 29  f( encoding==0 )
2170: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 53 51 4c 49   encoding = SQLI
2180: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 45  TE_UTF8;.      E
2190: 4e 43 28 64 62 29 20 3d 20 65 6e 63 6f 64 69 6e  NC(db) = encodin
21a0: 67 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70 44 66  g;.      db->pDf
21b0: 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  ltColl = sqlite3
21c0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
21d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49  SQLITE_UTF8, "BI
21e0: 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 20 20 7d  NARY", 0);.    }
21f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
2200: 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 61 74 74  f opening an att
2210: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2c 20  ached database, 
2220: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6d 75 63  the encoding muc
2230: 68 20 6d 61 74 63 68 20 45 4e 43 28 64 62 29 20  h match ENC(db) 
2240: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 65 74  */.      if( met
2250: 61 5b 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43  a[BTREE_TEXT_ENC
2260: 4f 44 49 4e 47 2d 31 5d 21 3d 45 4e 43 28 64 62  ODING-1]!=ENC(db
2270: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
2280: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a  ite3SetString(pz
2290: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 61 74 74  ErrMsg, db, "att
22a0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
22b0: 6d 75 73 74 20 75 73 65 20 74 68 65 20 73 61 6d  must use the sam
22c0: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e".            "
22d0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
22e0: 73 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 22  s main database"
22f0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2300: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2310: 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69 74 6f        goto inito
2320: 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  ne_error_out;.  
2330: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2340: 6c 73 65 7b 0a 20 20 20 20 44 62 53 65 74 50 72  lse{.    DbSetPr
2350: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
2360: 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20 7d 0a 20  DB_Empty);.  }. 
2370: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 65   pDb->pSchema->e
2380: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 0a 20  nc = ENC(db);.. 
2390: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
23a0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3d 3d 30  a->cache_size==0
23b0: 20 29 7b 0a 20 20 20 20 73 69 7a 65 20 3d 20 73   ){.    size = s
23c0: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 6d  qlite3AbsInt32(m
23d0: 65 74 61 5b 42 54 52 45 45 5f 44 45 46 41 55 4c  eta[BTREE_DEFAUL
23e0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 2d 31 5d 29  T_CACHE_SIZE-1])
23f0: 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3d 3d  ;.    if( size==
2400: 30 20 29 7b 20 73 69 7a 65 20 3d 20 53 51 4c 49  0 ){ size = SQLI
2410: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
2420: 5f 53 49 5a 45 3b 20 7d 0a 20 20 20 20 70 44 62  _SIZE; }.    pDb
2430: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
2440: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
2450: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
2460: 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e  tCacheSize(pDb->
2470: 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  pBt, pDb->pSchem
2480: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  a->cache_size);.
2490: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 66    }..  /*.  ** f
24a0: 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 31 20 20 20  ile_format==1   
24b0: 20 56 65 72 73 69 6f 6e 20 33 2e 30 2e 30 2e 0a   Version 3.0.0..
24c0: 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74    ** file_format
24d0: 3d 3d 32 20 20 20 20 56 65 72 73 69 6f 6e 20 33  ==2    Version 3
24e0: 2e 31 2e 33 2e 20 20 2f 2f 20 41 4c 54 45 52 20  .1.3.  // ALTER 
24f0: 54 41 42 4c 45 20 41 44 44 20 43 4f 4c 55 4d 4e  TABLE ADD COLUMN
2500: 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61  .  ** file_forma
2510: 74 3d 3d 33 20 20 20 20 56 65 72 73 69 6f 6e 20  t==3    Version 
2520: 33 2e 31 2e 34 2e 20 20 2f 2f 20 64 69 74 74 6f  3.1.4.  // ditto
2530: 20 62 75 74 20 77 69 74 68 20 6e 6f 6e 2d 4e 55   but with non-NU
2540: 4c 4c 20 64 65 66 61 75 6c 74 73 0a 20 20 2a 2a  LL defaults.  **
2550: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 34 20   file_format==4 
2560: 20 20 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 30     Version 3.3.0
2570: 2e 20 20 2f 2f 20 44 45 53 43 20 69 6e 64 69 63  .  // DESC indic
2580: 65 73 2e 20 20 42 6f 6f 6c 65 61 6e 20 63 6f 6e  es.  Boolean con
2590: 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 44  stants.  */.  pD
25a0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
25b0: 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 6d 65  _format = (u8)me
25c0: 74 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  ta[BTREE_FILE_FO
25d0: 52 4d 41 54 2d 31 5d 3b 0a 20 20 69 66 28 20 70  RMAT-1];.  if( p
25e0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
25f0: 65 5f 66 6f 72 6d 61 74 3d 3d 30 20 29 7b 0a 20  e_format==0 ){. 
2600: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
2610: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 31  >file_format = 1
2620: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
2630: 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
2640: 6f 72 6d 61 74 3e 53 51 4c 49 54 45 5f 4d 41 58  ormat>SQLITE_MAX
2650: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a  _FILE_FORMAT ){.
2660: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2670: 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 64  ring(pzErrMsg, d
2680: 62 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20  b, "unsupported 
2690: 66 69 6c 65 20 66 6f 72 6d 61 74 22 29 3b 0a 20  file format");. 
26a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26b0: 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20 69  RROR;.    goto i
26c0: 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74  nitone_error_out
26d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 69 63 6b  ;.  }..  /* Tick
26e0: 65 74 20 23 32 38 30 34 3a 20 20 57 68 65 6e 20  et #2804:  When 
26f0: 77 65 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61  we open a databa
2700: 73 65 20 69 6e 20 74 68 65 20 6e 65 77 65 72 20  se in the newer 
2710: 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 20 20 2a  file format,.  *
2720: 2a 20 63 6c 65 61 72 20 74 68 65 20 6c 65 67 61  * clear the lega
2730: 63 79 5f 66 69 6c 65 5f 66 6f 72 6d 61 74 20 70  cy_file_format p
2740: 72 61 67 6d 61 20 66 6c 61 67 20 73 6f 20 74 68  ragma flag so th
2750: 61 74 20 61 20 56 41 43 55 55 4d 20 77 69 6c 6c  at a VACUUM will
2760: 0a 20 20 2a 2a 20 6e 6f 74 20 64 6f 77 6e 67 72  .  ** not downgr
2770: 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2780: 20 61 6e 64 20 74 68 75 73 20 69 6e 76 61 6c 69   and thus invali
2790: 64 61 74 65 20 61 6e 79 20 64 65 73 63 65 6e 64  date any descend
27a0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  ing.  ** indices
27b0: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 6d   that the user m
27c0: 69 67 68 74 20 68 61 76 65 20 63 72 65 61 74 65  ight have create
27d0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  d..  */.  if( iD
27e0: 62 3d 3d 30 20 26 26 20 6d 65 74 61 5b 42 54 52  b==0 && meta[BTR
27f0: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2d 31  EE_FILE_FORMAT-1
2800: 5d 3e 3d 34 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ]>=4 ){.    db->
2810: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2820: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 3b 0a  _LegacyFileFmt;.
2830: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
2840: 68 65 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  he schema inform
2850: 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 74 68 65  ation out of the
2860: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 0a 20   schema tables. 
2870: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
2880: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
2890: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71   {.    char *zSq
28a0: 6c 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  l;.    zSql = sq
28b0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
28c0: 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
28d0: 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  T name, rootpage
28e0: 2c 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e  , sql FROM '%q'.
28f0: 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
2900: 64 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  d",.        db->
2910: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
2920: 7a 4d 61 73 74 65 72 4e 61 6d 65 29 3b 0a 23 69  zMasterName);.#i
2930: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2940: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
2950: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
2960: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
2970: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
2980: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
2990: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
29a0: 72 2a 29 3b 0a 20 20 20 20 20 20 78 41 75 74 68  r*);.      xAuth
29b0: 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
29c0: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
29d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  0;.#endif.      
29e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
29f0: 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  c(db, zSql, sqli
2a00: 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c  te3InitCallback,
2a10: 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a   &initData, 0);.
2a20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a30: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
2a40: 4e 0a 20 20 20 20 20 20 64 62 2d 3e 78 41 75 74  N.      db->xAut
2a50: 68 20 3d 20 78 41 75 74 68 3b 0a 20 20 20 20 7d  h = xAuth;.    }
2a60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2a70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2a80: 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63  rc = initData.rc
2a90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2aa0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 23  ree(db, zSql);.#
2ab0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ac0: 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 20 20 69  IT_ANALYZE.    i
2ad0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2af0: 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 64 62  3AnalysisLoad(db
2b00: 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 23 65  , iDb);.    }.#e
2b10: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 64  ndif.  }.  if( d
2b20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2b30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2b40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71  TE_NOMEM;.    sq
2b50: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2b60: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
2b70: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2b80: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 64 62 2d  QLITE_OK || (db-
2b90: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2ba0: 63 6f 76 65 72 79 4d 6f 64 65 29 29 7b 0a 20 20  coveryMode)){.  
2bb0: 20 20 2f 2a 20 42 6c 61 63 6b 20 6d 61 67 69 63    /* Black magic
2bc0: 3a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  : If the SQLITE_
2bd0: 52 65 63 6f 76 65 72 79 4d 6f 64 65 20 66 6c 61  RecoveryMode fla
2be0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63  g is set, then c
2bf0: 6f 6e 73 69 64 65 72 0a 20 20 20 20 2a 2a 20 74  onsider.    ** t
2c00: 68 65 20 73 63 68 65 6d 61 20 6c 6f 61 64 65 64  he schema loaded
2c10: 2c 20 65 76 65 6e 20 69 66 20 65 72 72 6f 72 73  , even if errors
2c20: 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20 74 68   occurred. In th
2c30: 69 73 20 73 69 74 75 61 74 69 6f 6e 20 74 68 65  is situation the
2c40: 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
2c50: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2c60: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  () operation wil
2c70: 6c 20 66 61 69 6c 2c 20 62 75 74 20 74 68 65 20  l fail, but the 
2c80: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 65 0a 20 20  following one.  
2c90: 20 20 2a 2a 20 77 69 6c 6c 20 61 74 74 65 6d 70    ** will attemp
2ca0: 74 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 65  t to compile the
2cb0: 20 73 75 70 70 6c 69 65 64 20 73 74 61 74 65 6d   supplied statem
2cc0: 65 6e 74 20 61 67 61 69 6e 73 74 20 77 68 61 74  ent against what
2cd0: 65 76 65 72 20 73 75 62 73 65 74 0a 20 20 20 20  ever subset.    
2ce0: 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ** of the schema
2cf0: 20 77 61 73 20 6c 6f 61 64 65 64 20 62 65 66 6f   was loaded befo
2d00: 72 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  re the error occ
2d10: 75 72 72 65 64 2e 20 54 68 65 20 70 72 69 6d 61  urred. The prima
2d20: 72 79 0a 20 20 20 20 2a 2a 20 70 75 72 70 6f 73  ry.    ** purpos
2d30: 65 20 6f 66 20 74 68 69 73 20 69 73 20 74 6f 20  e of this is to 
2d40: 61 6c 6c 6f 77 20 61 63 63 65 73 73 20 74 6f 20  allow access to 
2d50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2d60: 72 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 65  r table.    ** e
2d70: 76 65 6e 20 77 68 65 6e 20 69 74 73 20 63 6f 6e  ven when its con
2d80: 74 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20  tents have been 
2d90: 63 6f 72 72 75 70 74 65 64 2e 0a 20 20 20 20 2a  corrupted..    *
2da0: 2f 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  /.    DbSetPrope
2db0: 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f  rty(db, iDb, DB_
2dc0: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
2dd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2de0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  K;.  }..  /* Jum
2df0: 70 20 68 65 72 65 20 66 6f 72 20 61 6e 20 65 72  p here for an er
2e00: 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
2e10: 61 66 74 65 72 20 73 75 63 63 65 73 73 66 75 6c  after successful
2e20: 6c 79 20 61 6c 6c 6f 63 61 74 69 6e 67 0a 20 20  ly allocating.  
2e30: 2a 2a 20 63 75 72 4d 61 69 6e 20 61 6e 64 20 63  ** curMain and c
2e40: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 42 74  alling sqlite3Bt
2e50: 72 65 65 45 6e 74 65 72 28 29 2e 20 46 6f 72 20  reeEnter(). For 
2e60: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  an error that oc
2e70: 63 75 72 73 0a 20 20 2a 2a 20 62 65 66 6f 72 65  curs.  ** before
2e80: 20 74 68 61 74 20 70 6f 69 6e 74 2c 20 6a 75 6d   that point, jum
2e90: 70 20 74 6f 20 65 72 72 6f 72 5f 6f 75 74 2e 0a  p to error_out..
2ea0: 20 20 2a 2f 0a 69 6e 69 74 6f 6e 65 5f 65 72 72    */.initone_err
2eb0: 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 6f 70  or_out:.  if( op
2ec0: 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20  enedTransaction 
2ed0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
2ee0: 72 65 65 43 6f 6d 6d 69 74 28 70 44 62 2d 3e 70  reeCommit(pDb->p
2ef0: 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Bt);.  }.  sqlit
2f00: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 44 62  e3BtreeLeave(pDb
2f10: 2d 3e 70 42 74 29 3b 0a 0a 65 72 72 6f 72 5f 6f  ->pBt);..error_o
2f20: 75 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ut:.  if( rc==SQ
2f30: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63  LITE_NOMEM || rc
2f40: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
2f50: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e  OMEM ){.    db->
2f60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
2f70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  c;.}../*.** Init
2f90: 69 61 6c 69 7a 65 20 61 6c 6c 20 64 61 74 61 62  ialize all datab
2fa0: 61 73 65 20 66 69 6c 65 73 20 2d 20 74 68 65 20  ase files - the 
2fb0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
2fc0: 6c 65 2c 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  le, the file.** 
2fd0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 65  used to store te
2fe0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c 20  mporary tables, 
2ff0: 61 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  and any addition
3000: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
3010: 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69  s.** created usi
3020: 6e 67 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  ng ATTACH statem
3030: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 20  ents.  Return a 
3040: 73 75 63 63 65 73 73 20 63 6f 64 65 2e 20 20 49  success code.  I
3050: 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  f an.** error oc
3060: 63 75 72 73 2c 20 77 72 69 74 65 20 61 6e 20 65  curs, write an e
3070: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
3080: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  o *pzErrMsg..**.
3090: 2a 2a 20 41 66 74 65 72 20 61 20 64 61 74 61 62  ** After a datab
30a0: 61 73 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ase is initializ
30b0: 65 64 2c 20 74 68 65 20 44 42 5f 53 63 68 65 6d  ed, the DB_Schem
30c0: 61 4c 6f 61 64 65 64 20 62 69 74 20 69 73 20 73  aLoaded bit is s
30d0: 65 74 0a 2a 2a 20 62 69 74 20 69 73 20 73 65 74  et.** bit is set
30e0: 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 66 69   in the flags fi
30f0: 65 6c 64 20 6f 66 20 74 68 65 20 44 62 20 73 74  eld of the Db st
3100: 72 75 63 74 75 72 65 2e 20 49 66 20 74 68 65 20  ructure. If the 
3110: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
3120: 20 77 61 73 20 6f 66 20 7a 65 72 6f 2d 6c 65 6e   was of zero-len
3130: 67 74 68 2c 20 74 68 65 6e 20 74 68 65 20 44 42  gth, then the DB
3140: 5f 45 6d 70 74 79 20 66 6c 61 67 20 69 73 20 61  _Empty flag is a
3150: 6c 73 6f 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  lso set..*/.int 
3160: 73 71 6c 69 74 65 33 49 6e 69 74 28 73 71 6c 69  sqlite3Init(sqli
3170: 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 2a  te3 *db, char **
3180: 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74  pzErrMsg){.  int
3190: 20 69 2c 20 72 63 3b 0a 20 20 69 6e 74 20 63 6f   i, rc;.  int co
31a0: 6d 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20 3d 20  mmit_internal = 
31b0: 21 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  !(db->flags&SQLI
31c0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
31d0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
31e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31f0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
3200: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
3210: 4b 3b 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  K;.  db->init.bu
3220: 73 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  sy = 1;.  for(i=
3230: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
3240: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
3250: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 44 62 48  ++){.    if( DbH
3260: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
3270: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
3280: 64 29 20 7c 7c 20 69 3d 3d 31 20 29 20 63 6f 6e  d) || i==1 ) con
3290: 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20  tinue;.    rc = 
32a0: 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 64  sqlite3InitOne(d
32b0: 62 2c 20 69 2c 20 70 7a 45 72 72 4d 73 67 29 3b  b, i, pzErrMsg);
32c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
32d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
32e0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
32f0: 64 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  db, i);.    }.  
3300: 7d 0a 0a 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c  }..  /* Once all
3310: 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
3320: 61 73 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  ases have been i
3330: 6e 69 74 69 61 6c 69 73 65 64 2c 20 6c 6f 61 64  nitialised, load
3340: 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a   the schema.  **
3350: 20 66 6f 72 20 74 68 65 20 54 45 4d 50 20 64 61   for the TEMP da
3360: 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
3370: 6c 6f 61 64 65 64 20 6c 61 73 74 2c 20 61 73 20  loaded last, as 
3380: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
3390: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 6d 61  e.  ** schema ma
33a0: 79 20 63 6f 6e 74 61 69 6e 20 72 65 66 65 72 65  y contain refere
33b0: 6e 63 65 73 20 74 6f 20 6f 62 6a 65 63 74 73 20  nces to objects 
33c0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
33d0: 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  es..  */.#ifndef
33e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
33f0: 50 44 42 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  PDB.  if( rc==SQ
3400: 4c 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57 41 59  LITE_OK && ALWAY
3410: 53 28 64 62 2d 3e 6e 44 62 3e 31 29 0a 20 20 20  S(db->nDb>1).   
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
3440: 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 53 63 68  ty(db, 1, DB_Sch
3450: 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
3460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
3470: 69 74 4f 6e 65 28 64 62 2c 20 31 2c 20 70 7a 45  itOne(db, 1, pzE
3480: 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
3490: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
34a0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
34b0: 53 63 68 65 6d 61 28 64 62 2c 20 31 29 3b 0a 20  Schema(db, 1);. 
34c0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
34d0: 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
34e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
34f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6f 6d  SQLITE_OK && com
3500: 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20 29 7b 0a  mit_internal ){.
3510: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
3520: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3530: 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  (db);.  }..  ret
3540: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
3550: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3560: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
3570: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
3580: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 69 74   is already init
3590: 69 61 6c 69 73 65 64 2e 0a 2a 2a 20 4f 74 68 65  ialised..** Othe
35a0: 72 77 69 73 65 2c 20 74 68 65 20 73 63 68 65 6d  rwise, the schem
35b0: 61 20 69 73 20 6c 6f 61 64 65 64 2e 20 41 6e 20  a is loaded. An 
35c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
35d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
35e0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
35f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
3600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
3610: 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
3620: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
3630: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
3640: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3650: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
3660: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
3670: 73 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  sy ){.    rc = s
3680: 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
3690: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
36a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
36b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
36d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
36e0: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
36f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
3700: 20 43 68 65 63 6b 20 73 63 68 65 6d 61 20 63 6f   Check schema co
3710: 6f 6b 69 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  okies in all dat
3720: 61 62 61 73 65 73 2e 20 20 49 66 20 61 6e 79 20  abases.  If any 
3730: 63 6f 6f 6b 69 65 20 69 73 20 6f 75 74 0a 2a 2a  cookie is out.**
3740: 20 6f 66 20 64 61 74 65 20 73 65 74 20 70 50 61   of date set pPa
3750: 72 73 65 2d 3e 72 63 20 74 6f 20 53 51 4c 49 54  rse->rc to SQLIT
3760: 45 5f 53 43 48 45 4d 41 2e 20 20 49 66 20 61 6c  E_SCHEMA.  If al
3770: 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
3780: 0a 2a 2a 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** make no chan
3790: 67 65 73 20 74 6f 20 70 50 61 72 73 65 2d 3e 72  ges to pParse->r
37a0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
37b0: 64 20 73 63 68 65 6d 61 49 73 56 61 6c 69 64 28  d schemaIsValid(
37c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
37d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
37e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
37f0: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 72 63 3b  t iDb;.  int rc;
3800: 0a 20 20 69 6e 74 20 63 6f 6f 6b 69 65 3b 0a 0a  .  int cookie;..
3810: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
3820: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 29 3b  ->checkSchema );
3830: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3840: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
3850: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3860: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
3870: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
3880: 20 20 69 6e 74 20 6f 70 65 6e 65 64 54 72 61 6e    int openedTran
3890: 73 61 63 74 69 6f 6e 20 3d 20 30 3b 20 20 20 20  saction = 0;    
38a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
38b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
38c0: 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 42   opened */.    B
38d0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
38e0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 20 20 20  aDb[iDb].pBt;   
38f0: 20 20 2f 2a 20 42 74 72 65 65 20 64 61 74 61 62    /* Btree datab
3900: 61 73 65 20 74 6f 20 72 65 61 64 20 63 6f 6f 6b  ase to read cook
3910: 69 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 69  ie from */.    i
3920: 66 28 20 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74  f( pBt==0 ) cont
3930: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  inue;..    /* If
3940: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
3950: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6f 6e 6c  ready a read-onl
3960: 79 20 28 6f 72 20 72 65 61 64 2d 77 72 69 74 65  y (or read-write
3970: 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  ) transaction op
3980: 65 6e 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ened.    ** on t
3990: 68 65 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  he b-tree databa
39a0: 73 65 2c 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77  se, open one now
39b0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
39c0: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20 69 74  on is opened, it
39d0: 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
39e0: 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74   closed immediat
39f0: 65 6c 79 20 61 66 74 65 72 20 72 65 61 64 69 6e  ely after readin
3a00: 67 20 74 68 65 20 6d 65 74 61 2d 76 61 6c 75 65  g the meta-value
3a10: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71  . */.    if( !sq
3a20: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65  lite3BtreeIsInRe
3a30: 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  adTrans(pBt) ){.
3a40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
3a50: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
3a60: 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  s(pBt, 0);.     
3a70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3a80: 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c  NOMEM || rc==SQL
3a90: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
3aa0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  ){.        db->m
3ab0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3ad0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3ae0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
3af0: 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69   openedTransacti
3b00: 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  on = 1;.    }.. 
3b10: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
3b20: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 72 6f  chema cookie fro
3b30: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
3b40: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6d  If it does not m
3b50: 61 74 63 68 20 74 68 65 20 0a 20 20 20 20 2a 2a  atch the .    **
3b60: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 73   value stored as
3b70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
3b80: 6d 65 6d 6f 72 79 20 73 63 68 65 6d 61 20 72 65  memory schema re
3b90: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 0a 20 20  presentation,.  
3ba0: 20 20 2a 2a 20 73 65 74 20 50 61 72 73 65 2e 72    ** set Parse.r
3bb0: 63 20 74 6f 20 53 51 4c 49 54 45 5f 53 43 48 45  c to SQLITE_SCHE
3bc0: 4d 41 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  MA. */.    sqlit
3bd0: 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
3be0: 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Bt, BTREE_SCHEMA
3bf0: 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a  _VERSION, (u32 *
3c00: 29 26 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 69  )&cookie);.    i
3c10: 66 28 20 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e 61  f( cookie!=db->a
3c20: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
3c30: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  >schema_cookie )
3c40: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
3c50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
3c60: 4d 41 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  MA;.    }..    /
3c70: 2a 20 43 6c 6f 73 65 20 74 68 65 20 74 72 61 6e  * Close the tran
3c80: 73 61 63 74 69 6f 6e 2c 20 69 66 20 6f 6e 65 20  saction, if one 
3c90: 77 61 73 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20  was opened. */. 
3ca0: 20 20 20 69 66 28 20 6f 70 65 6e 65 64 54 72 61     if( openedTra
3cb0: 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
3cc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
3cd0: 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 7d  mmit(pBt);.    }
3ce0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
3cf0: 6e 76 65 72 74 20 61 20 73 63 68 65 6d 61 20 70  nvert a schema p
3d00: 6f 69 6e 74 65 72 20 69 6e 74 6f 20 74 68 65 20  ointer into the 
3d10: 69 44 62 20 69 6e 64 65 78 20 74 68 61 74 20 69  iDb index that i
3d20: 6e 64 69 63 61 74 65 73 0a 2a 2a 20 77 68 69 63  ndicates.** whic
3d30: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
3d40: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 74 68 65  in db->aDb[] the
3d50: 20 73 63 68 65 6d 61 20 72 65 66 65 72 73 20 74   schema refers t
3d60: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  o..**.** If the 
3d70: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 69 73  same database is
3d80: 20 61 74 74 61 63 68 65 64 20 6d 6f 72 65 20 74   attached more t
3d90: 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66 69  han once, the fi
3da0: 72 73 74 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  rst.** attached 
3db0: 64 61 74 61 62 61 73 65 20 69 73 20 72 65 74 75  database is retu
3dc0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
3dd0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
3de0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  x(sqlite3 *db, S
3df0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 29 7b  chema *pSchema){
3e00: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 30 30 30  .  int i = -1000
3e10: 30 30 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  000;..  /* If pS
3e20: 63 68 65 6d 61 20 69 73 20 4e 55 4c 4c 2c 20 74  chema is NULL, t
3e30: 68 65 6e 20 72 65 74 75 72 6e 20 2d 31 30 30 30  hen return -1000
3e40: 30 30 30 2e 20 54 68 69 73 20 68 61 70 70 65 6e  000. This happen
3e50: 73 20 77 68 65 6e 20 63 6f 64 65 20 69 6e 20 0a  s when code in .
3e60: 20 20 2a 2a 20 65 78 70 72 2e 63 20 69 73 20 74    ** expr.c is t
3e70: 72 79 69 6e 67 20 74 6f 20 72 65 73 6f 6c 76 65  rying to resolve
3e80: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
3e90: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
3ea0: 65 20 28 69 2e 65 2e 20 6f 6e 65 0a 20 20 2a 2a  e (i.e. one.  **
3eb0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 73 75   created by a su
3ec0: 62 2d 73 65 6c 65 63 74 29 2e 20 49 6e 20 74 68  b-select). In th
3ed0: 69 73 20 63 61 73 65 20 74 68 65 20 72 65 74 75  is case the retu
3ee0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
3ef0: 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20   .  ** function 
3f00: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
3f10: 75 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  used..  **.  ** 
3f20: 57 65 20 72 65 74 75 72 6e 20 2d 31 30 30 30 30  We return -10000
3f30: 30 30 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  00 instead of th
3f40: 65 20 6d 6f 72 65 20 75 73 75 61 6c 20 2d 31 20  e more usual -1 
3f50: 73 69 6d 70 6c 79 20 62 65 63 61 75 73 65 20 75  simply because u
3f60: 73 69 6e 67 0a 20 20 2a 2a 20 2d 31 30 30 30 30  sing.  ** -10000
3f70: 30 30 20 61 73 20 74 68 65 20 69 6e 63 6f 72 72  00 as the incorr
3f80: 65 63 74 20 69 6e 64 65 78 20 69 6e 74 6f 20 64  ect index into d
3f90: 62 2d 3e 61 44 62 5b 5d 20 69 73 20 6d 75 63 68  b->aDb[] is much
3fa0: 20 0a 20 20 2a 2a 20 6d 6f 72 65 20 6c 69 6b 65   .  ** more like
3fb0: 6c 79 20 74 6f 20 63 61 75 73 65 20 61 20 73 65  ly to cause a se
3fc0: 67 66 61 75 6c 74 20 74 68 61 6e 20 2d 31 20 28  gfault than -1 (
3fd0: 6f 66 20 63 6f 75 72 73 65 20 74 68 65 72 65 20  of course there 
3fe0: 61 72 65 20 61 73 73 65 72 74 28 29 0a 20 20 2a  are assert().  *
3ff0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 6f  * statements too
4000: 2c 20 62 75 74 20 69 74 20 6e 65 76 65 72 20 68  , but it never h
4010: 75 72 74 73 20 74 6f 20 70 6c 61 79 20 74 68 65  urts to play the
4020: 20 6f 64 64 73 29 2e 0a 20 20 2a 2f 0a 20 20 61   odds)..  */.  a
4030: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4040: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
4050: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 53  tex) );.  if( pS
4060: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 66 6f 72  chema ){.    for
4070: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 64  (i=0; ALWAYS(i<d
4080: 62 2d 3e 6e 44 62 29 3b 20 69 2b 2b 29 7b 0a 20  b->nDb); i++){. 
4090: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
40a0: 5b 69 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 53 63  [i].pSchema==pSc
40b0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
40c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
40d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
40e0: 20 69 3e 3d 30 20 26 26 20 69 3c 64 62 2d 3e 6e   i>=0 && i<db->n
40f0: 44 62 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Db );.  }.  retu
4100: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn i;.}../*.** C
4110: 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46 2d 38  ompile the UTF-8
4120: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
4130: 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f  tement zSql into
4140: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
4150: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
4160: 6e 74 20 73 71 6c 69 74 65 33 50 72 65 70 61 72  nt sqlite3Prepar
4170: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
4180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4190: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
41a0: 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e. */.  const ch
41b0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
41c0: 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64    /* UTF-8 encod
41d0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
41e0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
41f0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
4200: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
4210: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
4220: 20 20 69 6e 74 20 73 61 76 65 53 71 6c 46 6c 61    int saveSqlFla
4230: 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  g,          /* T
4240: 72 75 65 20 74 6f 20 63 6f 70 79 20 53 51 4c 20  rue to copy SQL 
4250: 74 65 78 74 20 69 6e 74 6f 20 74 68 65 20 73 71  text into the sq
4260: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2f 0a 20 20  lite3_stmt */.  
4270: 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65  Vdbe *pReprepare
4280: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20  ,         /* VM 
4290: 62 65 69 6e 67 20 72 65 70 72 65 70 61 72 65 64  being reprepared
42a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
42b0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
42c0: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
42d0: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
42e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
42f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
4300: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
4310: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
4320: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
4330: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
4350: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
4360: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
4370: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
4380: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
4390: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
43a0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
43b0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
43c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
43d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
43e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
43f0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
4400: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
4410: 2a 2f 0a 20 20 70 50 61 72 73 65 20 3d 20 73 71  */.  pParse = sq
4420: 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 5a  lite3StackAllocZ
4430: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
4440: 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66 28 20  pParse));.  if( 
4450: 70 50 61 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  pParse==0 ){.   
4460: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4470: 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
4480: 5f 70 72 65 70 61 72 65 3b 0a 20 20 7d 0a 20 20  _prepare;.  }.  
4490: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
44a0: 72 65 20 3d 20 70 52 65 70 72 65 70 61 72 65 3b  re = pReprepare;
44b0: 0a 20 20 61 73 73 65 72 74 28 20 70 70 53 74 6d  .  assert( ppStm
44c0: 74 20 26 26 20 2a 70 70 53 74 6d 74 3d 3d 30 20  t && *ppStmt==0 
44d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
44e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
44f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4500: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
4510: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
4520: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 76 65 72 69  /* Check to veri
4530: 66 79 20 74 68 61 74 20 69 74 20 69 73 20 70 6f  fy that it is po
4540: 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 61 20  ssible to get a 
4550: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c  read lock on all
4560: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
4570: 63 68 65 6d 61 73 2e 20 20 54 68 65 20 69 6e 61  chemas.  The ina
4580: 62 69 6c 69 74 79 20 74 6f 20 67 65 74 20 61 20  bility to get a 
4590: 72 65 61 64 20 6c 6f 63 6b 20 69 6e 64 69 63 61  read lock indica
45a0: 74 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 73 6f  tes that.  ** so
45b0: 6d 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  me other databas
45c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
45d0: 68 6f 6c 64 69 6e 67 20 61 20 77 72 69 74 65 2d  holding a write-
45e0: 6c 6f 63 6b 2c 20 77 68 69 63 68 20 69 6e 0a 20  lock, which in. 
45f0: 20 2a 2a 20 74 75 72 6e 20 6d 65 61 6e 73 20 74   ** turn means t
4600: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 63 6f  hat the other co
4610: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nnection has mad
4620: 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 68  e uncommitted ch
4630: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  anges.  ** to th
4640: 65 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2a 0a 20  e schema..  **. 
4650: 20 2a 2a 20 57 65 72 65 20 77 65 20 74 6f 20 70   ** Were we to p
4660: 72 6f 63 65 65 64 20 61 6e 64 20 70 72 65 70 61  roceed and prepa
4670: 72 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  re the statement
4680: 20 61 67 61 69 6e 73 74 20 74 68 65 20 75 6e 63   against the unc
4690: 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 73 63  ommitted.  ** sc
46a0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 6e 64  hema changes and
46b0: 20 69 66 20 74 68 6f 73 65 20 73 63 68 65 6d 61   if those schema
46c0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 73 75 62   changes are sub
46d0: 73 65 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65 64  sequently rolled
46e0: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 6e 64 20 64  .  ** back and d
46f0: 69 66 66 65 72 65 6e 74 20 63 68 61 6e 67 65 73  ifferent changes
4700: 20 61 72 65 20 6d 61 64 65 20 69 6e 20 74 68 65   are made in the
4710: 69 72 20 70 6c 61 63 65 2c 20 74 68 65 6e 20 77  ir place, then w
4720: 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72  hen this.  ** pr
4730: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
4740: 20 67 6f 65 73 20 74 6f 20 72 75 6e 20 74 68 65   goes to run the
4750: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77   schema cookie w
4760: 6f 75 6c 64 20 66 61 69 6c 20 74 6f 20 64 65 74  ould fail to det
4770: 65 63 74 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ect.  ** the sch
4780: 65 6d 61 20 63 68 61 6e 67 65 2e 20 20 44 69 73  ema change.  Dis
4790: 61 73 74 65 72 20 77 6f 75 6c 64 20 66 6f 6c 6c  aster would foll
47a0: 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ow..  **.  ** Th
47b0: 69 73 20 74 68 72 65 61 64 20 69 73 20 63 75 72  is thread is cur
47c0: 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 6d  rently holding m
47d0: 75 74 65 78 65 73 20 6f 6e 20 61 6c 6c 20 42 74  utexes on all Bt
47e0: 72 65 65 73 20 28 62 65 63 61 75 73 65 0a 20 20  rees (because.  
47f0: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
4800: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29  3BtreeEnterAll()
4810: 20 69 6e 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41   in sqlite3LockA
4820: 6e 64 50 72 65 70 61 72 65 28 29 29 20 73 6f 20  ndPrepare()) so 
4830: 69 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  it.  ** is not p
4840: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 6f 74  ossible for anot
4850: 68 65 72 20 74 68 72 65 61 64 20 74 6f 20 73 74  her thread to st
4860: 61 72 74 20 61 20 6e 65 77 20 73 63 68 65 6d 61  art a new schema
4870: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 68 69   change.  ** whi
4880: 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  le this routine 
4890: 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 48 65 6e  is running.  Hen
48a0: 63 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ce, we do not ne
48b0: 65 64 20 74 6f 20 68 6f 6c 64 20 0a 20 20 2a 2a  ed to hold .  **
48c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 73 63   locks on the sc
48d0: 68 65 6d 61 2c 20 77 65 20 6a 75 73 74 20 6e 65  hema, we just ne
48e0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
48f0: 6e 6f 62 6f 64 79 20 65 6c 73 65 20 69 73 20 0a  nobody else is .
4900: 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 68 65    ** holding the
4910: 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  m..  **.  ** Not
4920: 65 20 74 68 61 74 20 73 65 74 74 69 6e 67 20 52  e that setting R
4930: 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
4940: 6f 76 65 72 72 69 64 65 73 20 6d 6f 73 74 20 6c  overrides most l
4950: 6f 63 6b 20 64 65 74 65 63 74 69 6f 6e 2c 0a 20  ock detection,. 
4960: 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 20   ** but it does 
4970: 2a 6e 6f 74 2a 20 6f 76 65 72 72 69 64 65 20 73  *not* override s
4980: 63 68 65 6d 61 20 6c 6f 63 6b 20 64 65 74 65 63  chema lock detec
4990: 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 61 6c  tion, so this al
49a0: 6c 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 77 6f 72  l still.  ** wor
49b0: 6b 73 20 65 76 65 6e 20 69 66 20 52 45 41 44 5f  ks even if READ_
49c0: 55 4e 43 4f 4d 4d 49 54 54 45 44 20 69 73 20 73  UNCOMMITTED is s
49d0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
49e0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
49f0: 2b 2b 29 20 7b 0a 20 20 20 20 42 74 72 65 65 20  ++) {.    Btree 
4a00: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
4a10: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
4a20: 42 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  Bt ){.      asse
4a30: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
4a40: 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 29 20  HoldsMutex(pBt) 
4a50: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
4a60: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
4a70: 4c 6f 63 6b 65 64 28 70 42 74 29 3b 0a 20 20 20  Locked(pBt);.   
4a80: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
4a90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4aa0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
4ab0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
4ac0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
4ad0: 2c 20 72 63 2c 20 22 64 61 74 61 62 61 73 65 20  , rc, "database 
4ae0: 73 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64  schema is locked
4af0: 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 20  : %s", zDb);.   
4b00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
4b10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4b20: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
4b30: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  d );.        got
4b40: 6f 20 65 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20  o end_prepare;. 
4b50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4b60: 0a 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ..  sqlite3VtabU
4b70: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a  nlockList(db);..
4b80: 20 20 70 50 61 72 73 65 2d 3e 64 62 20 3d 20 64    pParse->db = d
4b90: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  b;.  pParse->nQu
4ba0: 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c  eryLoop = (doubl
4bb0: 65 29 31 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  e)1;.  if( nByte
4bc0: 73 3e 3d 30 20 26 26 20 28 6e 42 79 74 65 73 3d  s>=0 && (nBytes=
4bd0: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 42 79 74 65  =0 || zSql[nByte
4be0: 73 2d 31 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20  s-1]!=0) ){.    
4bf0: 63 68 61 72 20 2a 7a 53 71 6c 43 6f 70 79 3b 0a  char *zSqlCopy;.
4c00: 20 20 20 20 69 6e 74 20 6d 78 4c 65 6e 20 3d 20      int mxLen = 
4c10: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4c20: 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
4c30: 54 48 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  TH];.    testcas
4c40: 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78 4c 65 6e  e( nBytes==mxLen
4c50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4c60: 28 20 6e 42 79 74 65 73 3d 3d 6d 78 4c 65 6e 2b  ( nBytes==mxLen+
4c70: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  1 );.    if( nBy
4c80: 74 65 73 3e 6d 78 4c 65 6e 20 29 7b 0a 20 20 20  tes>mxLen ){.   
4c90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
4ca0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  db, SQLITE_TOOBI
4cb0: 47 2c 20 22 73 74 61 74 65 6d 65 6e 74 20 74 6f  G, "statement to
4cc0: 6f 20 6c 6f 6e 67 22 29 3b 0a 20 20 20 20 20 20  o long");.      
4cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
4ce0: 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  xit(db, SQLITE_T
4cf0: 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20 20 67 6f  OOBIG);.      go
4d00: 74 6f 20 65 6e 64 5f 70 72 65 70 61 72 65 3b 0a  to end_prepare;.
4d10: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 43 6f      }.    zSqlCo
4d20: 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  py = sqlite3DbSt
4d30: 72 4e 44 75 70 28 64 62 2c 20 7a 53 71 6c 2c 20  rNDup(db, zSql, 
4d40: 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69 66 28  nBytes);.    if(
4d50: 20 7a 53 71 6c 43 6f 70 79 20 29 7b 0a 20 20 20   zSqlCopy ){.   
4d60: 20 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72     sqlite3RunPar
4d70: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
4d80: 43 6f 70 79 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Copy, &zErrMsg);
4d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4da0: 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 43 6f 70  Free(db, zSqlCop
4db0: 79 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  y);.      pParse
4dc0: 2d 3e 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b  ->zTail = &zSql[
4dd0: 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 7a 53  pParse->zTail-zS
4de0: 71 6c 43 6f 70 79 5d 3b 0a 20 20 20 20 7d 65 6c  qlCopy];.    }el
4df0: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  se{.      pParse
4e00: 2d 3e 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b  ->zTail = &zSql[
4e10: 6e 42 79 74 65 73 5d 3b 0a 20 20 20 20 7d 0a 20  nBytes];.    }. 
4e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
4e30: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
4e40: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
4e50: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Msg);.  }.  asse
4e60: 72 74 28 20 31 3d 3d 28 69 6e 74 29 70 50 61 72  rt( 1==(int)pPar
4e70: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 29  se->nQueryLoop )
4e80: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
4e90: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
4ea0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
4eb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
4ec0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63    if( pParse->rc
4ed0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
4ee0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
4ef0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4f00: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
4f10: 61 20 29 7b 0a 20 20 20 20 73 63 68 65 6d 61 49  a ){.    schemaI
4f20: 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 3b 0a  sValid(pParse);.
4f30: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
4f40: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48  ->rc==SQLITE_SCH
4f50: 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EMA ){.    sqlit
4f60: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
4f70: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
4f80: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
4f90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4fa0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
4fb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
4fc0: 20 69 66 28 20 70 7a 54 61 69 6c 20 29 7b 0a 20   if( pzTail ){. 
4fd0: 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20 70 50 61     *pzTail = pPa
4fe0: 72 73 65 2d 3e 7a 54 61 69 6c 3b 0a 20 20 7d 0a  rse->zTail;.  }.
4ff0: 20 20 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 72    rc = pParse->r
5000: 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
5010: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
5020: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5030: 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e 70  _OK && pParse->p
5040: 56 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e  Vdbe && pParse->
5050: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
5060: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5070: 20 2a 20 63 6f 6e 73 74 20 61 7a 43 6f 6c 4e 61   * const azColNa
5080: 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  me[] = {.       
5090: 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22  "addr", "opcode"
50a0: 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70  , "p1", "p2", "p
50b0: 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20  3", "p4", "p5", 
50c0: 22 63 6f 6d 6d 65 6e 74 22 2c 0a 20 20 20 20 20  "comment",.     
50d0: 20 20 22 73 65 6c 65 63 74 69 64 22 2c 20 22 6f    "selectid", "o
50e0: 72 64 65 72 22 2c 20 22 66 72 6f 6d 22 2c 20 22  rder", "from", "
50f0: 64 65 74 61 69 6c 22 0a 20 20 20 20 7d 3b 0a 20  detail".    };. 
5100: 20 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 6d     int iFirst, m
5110: 78 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  x;.    if( pPars
5120: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
5130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5140: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 70 50 61  beSetNumCols(pPa
5150: 72 73 65 2d 3e 70 56 64 62 65 2c 20 34 29 3b 0a  rse->pVdbe, 4);.
5160: 20 20 20 20 20 20 69 46 69 72 73 74 20 3d 20 38        iFirst = 8
5170: 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20 31 32 3b  ;.      mx = 12;
5180: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
51a0: 4e 75 6d 43 6f 6c 73 28 70 50 61 72 73 65 2d 3e  NumCols(pParse->
51b0: 70 56 64 62 65 2c 20 38 29 3b 0a 20 20 20 20 20  pVdbe, 8);.     
51c0: 20 69 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20   iFirst = 0;.   
51d0: 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20 20 20 7d     mx = 8;.    }
51e0: 0a 20 20 20 20 66 6f 72 28 69 3d 69 46 69 72 73  .    for(i=iFirs
51f0: 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  t; i<mx; i++){. 
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5210: 53 65 74 43 6f 6c 4e 61 6d 65 28 70 50 61 72 73  SetColName(pPars
5220: 65 2d 3e 70 56 64 62 65 2c 20 69 2d 69 46 69 72  e->pVdbe, i-iFir
5230: 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45  st, COLNAME_NAME
5240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
5260: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c 49  ColName[i], SQLI
5270: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
5280: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
5290: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
52a0: 2e 62 75 73 79 3d 3d 30 20 7c 7c 20 73 61 76 65  .busy==0 || save
52b0: 53 71 6c 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  SqlFlag==0 );.  
52c0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
52d0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  y==0 ){.    Vdbe
52e0: 20 2a 70 56 64 62 65 20 3d 20 70 50 61 72 73 65   *pVdbe = pParse
52f0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c  ->pVdbe;.    sql
5300: 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 70  ite3VdbeSetSql(p
5310: 56 64 62 65 2c 20 7a 53 71 6c 2c 20 28 69 6e 74  Vdbe, zSql, (int
5320: 29 28 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d  )(pParse->zTail-
5330: 7a 53 71 6c 29 2c 20 73 61 76 65 53 71 6c 46 6c  zSql), saveSqlFl
5340: 61 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ag);.  }.  if( p
5350: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 26 26 20  Parse->pVdbe && 
5360: 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc!=SQLITE_OK |
5370: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
5380: 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ed) ){.    sqlit
5390: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 70  e3VdbeFinalize(p
53a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20  Parse->pVdbe);. 
53b0: 20 20 20 61 73 73 65 72 74 28 21 28 2a 70 70 53     assert(!(*ppS
53c0: 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tmt));.  }else{.
53d0: 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 28 73      *ppStmt = (s
53e0: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 50 61  qlite3_stmt*)pPa
53f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a  rse->pVdbe;.  }.
5400: 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
5410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5420: 6f 72 28 64 62 2c 20 72 63 2c 20 22 25 73 22 2c  or(db, rc, "%s",
5430: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
5440: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5450: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 65 6c   zErrMsg);.  }el
5460: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
5470: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
5480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
5490: 65 20 61 6e 79 20 54 72 69 67 67 65 72 50 72 67  e any TriggerPrg
54a0: 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f   structures allo
54b0: 63 61 74 65 64 20 77 68 69 6c 65 20 70 61 72 73  cated while pars
54c0: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
54d0: 6e 74 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  nt. */.  while( 
54e0: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
54f0: 50 72 67 20 29 7b 0a 20 20 20 20 54 72 69 67 67  Prg ){.    Trigg
5500: 65 72 50 72 67 20 2a 70 54 20 3d 20 70 50 61 72  erPrg *pT = pPar
5510: 73 65 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b  se->pTriggerPrg;
5520: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 54 72  .    pParse->pTr
5530: 69 67 67 65 72 50 72 67 20 3d 20 70 54 2d 3e 70  iggerPrg = pT->p
5540: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
5550: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 29 3b  3DbFree(db, pT);
5560: 0a 20 20 7d 0a 0a 65 6e 64 5f 70 72 65 70 61 72  .  }..end_prepar
5570: 65 3a 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e:..  sqlite3Sta
5580: 63 6b 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  ckFree(db, pPars
5590: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
55a0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
55b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 72 63  );.  assert( (rc
55c0: 26 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  &db->errMask)==r
55d0: 63 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  c );.  return rc
55e0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
55f0: 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65  qlite3LockAndPre
5600: 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
5610: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
5620: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
5630: 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ndle. */.  const
5640: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
5650: 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e       /* UTF-8 en
5660: 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d  coded SQL statem
5670: 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ent. */.  int nB
5680: 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  ytes,           
5690: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
56a0: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20   zSql in bytes. 
56b0: 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 53 71 6c  */.  int saveSql
56c0: 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 2f  Flag,          /
56d0: 2a 20 54 72 75 65 20 74 6f 20 63 6f 70 79 20 53  * True to copy S
56e0: 51 4c 20 74 65 78 74 20 69 6e 74 6f 20 74 68 65  QL text into the
56f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2f   sqlite3_stmt */
5700: 0a 20 20 56 64 62 65 20 2a 70 4f 6c 64 2c 20 20  .  Vdbe *pOld,  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5720: 56 4d 20 62 65 69 6e 67 20 72 65 70 72 65 70 61  VM being reprepa
5730: 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
5740: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
5750: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
5760: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
5770: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
5780: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5790: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
57a0: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
57b0: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
57c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
57d0: 65 72 74 28 20 70 70 53 74 6d 74 21 3d 30 20 29  ert( ppStmt!=0 )
57e0: 3b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  ;.  *ppStmt = 0;
57f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
5800: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
5810: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5820: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
5830: 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
5840: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
5850: 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
5860: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
5870: 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
5880: 74 65 33 50 72 65 70 61 72 65 28 64 62 2c 20 7a  te3Prepare(db, z
5890: 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 73 61 76  Sql, nBytes, sav
58a0: 65 53 71 6c 46 6c 61 67 2c 20 70 4f 6c 64 2c 20  eSqlFlag, pOld, 
58b0: 70 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c 29 3b  ppStmt, pzTail);
58c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
58d0: 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20 20  E_SCHEMA ){.    
58e0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
58f0: 28 2a 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  (*ppStmt);.    r
5900: 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61  c = sqlite3Prepa
5910: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79  re(db, zSql, nBy
5920: 74 65 73 2c 20 73 61 76 65 53 71 6c 46 6c 61 67  tes, saveSqlFlag
5930: 2c 20 70 4f 6c 64 2c 20 70 70 53 74 6d 74 2c 20  , pOld, ppStmt, 
5940: 70 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 20 20 73  pzTail);.  }.  s
5950: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
5960: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
5970: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
5980: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
5990: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
59a0: 20 52 65 72 75 6e 20 74 68 65 20 63 6f 6d 70 69   Rerun the compi
59b0: 6c 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  lation of a stat
59c0: 65 6d 65 6e 74 20 61 66 74 65 72 20 61 20 73 63  ement after a sc
59d0: 68 65 6d 61 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a  hema change..**.
59e0: 2a 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  ** If the statem
59f0: 65 6e 74 20 69 73 20 73 75 63 63 65 73 73 66 75  ent is successfu
5a00: 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20  lly recompiled, 
5a10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5a20: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
5a30: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
5a40: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 63 6f 6d   cannot be recom
5a50: 70 69 6c 65 64 20 62 65 63 61 75 73 65 20 61 6e  piled because an
5a60: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
5a70: 20 68 61 73 0a 2a 2a 20 6c 6f 63 6b 65 64 20 74   has.** locked t
5a80: 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 73 74 65  he sqlite3_maste
5a90: 72 20 74 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  r table, return 
5aa0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 20 49  SQLITE_LOCKED. I
5ab0: 66 20 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f  f any other erro
5ac0: 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74  r.** occurs, ret
5ad0: 75 72 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  urn SQLITE_SCHEM
5ae0: 41 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  A..*/.int sqlite
5af0: 33 52 65 70 72 65 70 61 72 65 28 56 64 62 65 20  3Reprepare(Vdbe 
5b00: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
5b10: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5b20: 4e 65 77 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  New;.  const cha
5b30: 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74  r *zSql;.  sqlit
5b40: 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72  e3 *db;..  asser
5b50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5b60: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 56 64 62  _held(sqlite3Vdb
5b70: 65 44 62 28 70 29 2d 3e 6d 75 74 65 78 29 20 29  eDb(p)->mutex) )
5b80: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
5b90: 65 33 5f 73 71 6c 28 28 73 71 6c 69 74 65 33 5f  e3_sql((sqlite3_
5ba0: 73 74 6d 74 20 2a 29 70 29 3b 0a 20 20 61 73 73  stmt *)p);.  ass
5bb0: 65 72 74 28 20 7a 53 71 6c 21 3d 30 20 29 3b 20  ert( zSql!=0 ); 
5bc0: 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20 6f 6e   /* Reprepare on
5bd0: 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 72  ly called for pr
5be0: 65 70 61 72 65 5f 76 32 28 29 20 73 74 61 74 65  epare_v2() state
5bf0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 64 62 20 3d 20  ments */.  db = 
5c00: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29  sqlite3VdbeDb(p)
5c10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5c20: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
5c30: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
5c40: 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41  c = sqlite3LockA
5c50: 6e 64 50 72 65 70 61 72 65 28 64 62 2c 20 7a 53  ndPrepare(db, zS
5c60: 71 6c 2c 20 2d 31 2c 20 30 2c 20 70 2c 20 26 70  ql, -1, 0, p, &p
5c70: 4e 65 77 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  New, 0);.  if( r
5c80: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  c ){.    if( rc=
5c90: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
5ca0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
5cb0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5cc0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
5cd0: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  New==0 );.    re
5ce0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65  turn rc;.  }else
5cf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
5d00: 65 77 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  ew!=0 );.  }.  s
5d10: 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28 28  qlite3VdbeSwap((
5d20: 56 64 62 65 2a 29 70 4e 65 77 2c 20 70 29 3b 0a  Vdbe*)pNew, p);.
5d30: 20 20 73 71 6c 69 74 65 33 54 72 61 6e 73 66 65    sqlite3Transfe
5d40: 72 42 69 6e 64 69 6e 67 73 28 70 4e 65 77 2c 20  rBindings(pNew, 
5d50: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
5d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5d70: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
5d80: 28 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20  (Vdbe*)pNew);.  
5d90: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
5da0: 69 7a 65 28 28 56 64 62 65 2a 29 70 4e 65 77 29  ize((Vdbe*)pNew)
5db0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5dc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
5dd0: 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  Two versions of 
5de0: 74 68 65 20 6f 66 66 69 63 69 61 6c 20 41 50 49  the official API
5df0: 2e 20 20 4c 65 67 61 63 79 20 61 6e 64 20 6e 65  .  Legacy and ne
5e00: 77 20 75 73 65 2e 20 20 49 6e 20 74 68 65 20 6c  w use.  In the l
5e10: 65 67 61 63 79 0a 2a 2a 20 76 65 72 73 69 6f 6e  egacy.** version
5e20: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  , the original S
5e30: 51 4c 20 74 65 78 74 20 69 73 20 6e 6f 74 20 73  QL text is not s
5e40: 61 76 65 64 20 69 6e 20 74 68 65 20 70 72 65 70  aved in the prep
5e50: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ared statement.*
5e60: 2a 20 61 6e 64 20 73 6f 20 69 66 20 61 20 73 63  * and so if a sc
5e70: 68 65 6d 61 20 63 68 61 6e 67 65 20 6f 63 63 75  hema change occu
5e80: 72 73 2c 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  rs, SQLITE_SCHEM
5e90: 41 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  A is returned by
5ea0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70  .** sqlite3_step
5eb0: 28 29 2e 20 20 49 6e 20 74 68 65 20 6e 65 77 20  ().  In the new 
5ec0: 76 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69  version, the ori
5ed0: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69  ginal SQL text i
5ee0: 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a 20 61 6e  s retained.** an
5ef0: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  d the statement 
5f00: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
5f10: 20 72 65 63 6f 6d 70 69 6c 65 64 20 69 66 20 61   recompiled if a
5f20: 6e 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a  n schema change.
5f30: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
5f40: 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  t sqlite3_prepar
5f50: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
5f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5f70: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
5f80: 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e. */.  const ch
5f90: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
5fa0: 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64    /* UTF-8 encod
5fb0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
5fc0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
5fd0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
5fe0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
5ff0: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
6000: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6010: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
6020: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
6030: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
6040: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
6050: 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c  st char **pzTail
6060: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
6070: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
6080: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
6090: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
60a0: 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65  e3LockAndPrepare
60b0: 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c  (db,zSql,nBytes,
60c0: 30 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69  0,0,ppStmt,pzTai
60d0: 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
60e0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20  E_ENABLE_SQLRR. 
60f0: 20 53 52 52 65 63 50 72 65 70 61 72 65 28 64 62   SRRecPrepare(db
6100: 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20  , zSql, nBytes, 
6110: 30 2c 20 2a 70 70 53 74 6d 74 29 3b 0a 23 65 6e  0, *ppStmt);.#en
6120: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72 63  dif.  assert( rc
6130: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
6140: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
6150: 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45  tmt==0 );  /* VE
6160: 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a  RIFY: F13021 */.
6170: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
6180: 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  nt sqlite3_prepa
6190: 72 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  re_v2(.  sqlite3
61a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
61b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
61c0: 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73  andle. */.  cons
61d0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
61e0: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65        /* UTF-8 e
61f0: 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65  ncoded SQL state
6200: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ment. */.  int n
6210: 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20  Bytes,          
6220: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
6230: 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e  f zSql in bytes.
6240: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
6250: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
6260: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
6270: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
6280: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
6290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
62a0: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
62b0: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
62c0: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
62d0: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
62e0: 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65  qlite3LockAndPre
62f0: 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79  pare(db,zSql,nBy
6300: 74 65 73 2c 31 2c 30 2c 70 70 53 74 6d 74 2c 70  tes,1,0,ppStmt,p
6310: 7a 54 61 69 6c 29 3b 0a 23 69 66 64 65 66 20 53  zTail);.#ifdef S
6320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
6330: 52 52 0a 20 20 53 52 52 65 63 50 72 65 70 61 72  RR.  SRRecPrepar
6340: 65 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74  e(db, zSql, nByt
6350: 65 73 2c 20 31 2c 20 2a 70 70 53 74 6d 74 29 3b  es, 1, *ppStmt);
6360: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
6370: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6380: 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20  || ppStmt==0 || 
6390: 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f  *ppStmt==0 );  /
63a0: 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30 32 31  * VERIFY: F13021
63b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
63c0: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
63d0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
63e0: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65  *.** Compile the
63f0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
6400: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a 53  SQL statement zS
6410: 71 6c 20 69 6e 74 6f 20 61 20 73 74 61 74 65 6d  ql into a statem
6420: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
6430: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6440: 33 50 72 65 70 61 72 65 31 36 28 0a 20 20 73 71  3Prepare16(.  sq
6450: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
6460: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6470: 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a  ase handle. */ .
6480: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
6490: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ql,         /* U
64a0: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51  TF-16 encoded SQ
64b0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  L statement. */.
64c0: 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20    int nBytes,   
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
64e0: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
64f0: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 6e 74   bytes. */.  int
6500: 20 73 61 76 65 53 71 6c 46 6c 61 67 2c 20 20 20   saveSqlFlag,   
6510: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6520: 6f 20 73 61 76 65 20 53 51 4c 20 74 65 78 74 20  o save SQL text 
6530: 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  into the sqlite3
6540: 5f 73 74 6d 74 20 2a 2f 0a 20 20 73 71 6c 69 74  _stmt */.  sqlit
6550: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
6560: 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70  ,    /* OUT: A p
6570: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
6580: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6590: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
65a0: 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20   **pzTail       
65b0: 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70  /* OUT: End of p
65c0: 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  arsed string */.
65d0: 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ){.  /* This fun
65e0: 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
65f0: 77 6f 72 6b 73 20 62 79 20 66 69 72 73 74 20 74  works by first t
6600: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
6610: 55 54 46 2d 31 36 0a 20 20 2a 2a 20 65 6e 63 6f  UTF-16.  ** enco
6620: 64 65 64 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ded string to UT
6630: 46 2d 38 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 69  F-8, then invoki
6640: 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ng sqlite3_prepa
6650: 72 65 28 29 2e 20 54 68 65 0a 20 20 2a 2a 20 74  re(). The.  ** t
6660: 72 69 63 6b 79 20 62 69 74 20 69 73 20 66 69 67  ricky bit is fig
6670: 75 72 69 6e 67 20 6f 75 74 20 74 68 65 20 70 6f  uring out the po
6680: 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
6690: 69 6e 20 2a 70 7a 54 61 69 6c 2e 0a 20 20 2a 2f  in *pzTail..  */
66a0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 38 3b 0a  .  char *zSql8;.
66b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
66c0: 61 69 6c 38 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ail8 = 0;.  int 
66d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
66e0: 0a 20 20 61 73 73 65 72 74 28 20 70 70 53 74 6d  .  assert( ppStm
66f0: 74 20 29 3b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  t );.  *ppStmt =
6700: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
6710: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6720: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
6730: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
6740: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
6750: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6760: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7a 53  db->mutex);.  zS
6770: 71 6c 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ql8 = sqlite3Utf
6780: 31 36 74 6f 38 28 64 62 2c 20 7a 53 71 6c 2c 20  16to8(db, zSql, 
6790: 6e 42 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 55  nBytes, SQLITE_U
67a0: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
67b0: 66 28 20 7a 53 71 6c 38 20 29 7b 0a 20 20 20 20  f( zSql8 ){.    
67c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b  rc = sqlite3Lock
67d0: 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 20 7a  AndPrepare(db, z
67e0: 53 71 6c 38 2c 20 2d 31 2c 20 73 61 76 65 53 71  Sql8, -1, saveSq
67f0: 6c 46 6c 61 67 2c 20 30 2c 20 70 70 53 74 6d 74  lFlag, 0, ppStmt
6800: 2c 20 26 7a 54 61 69 6c 38 29 3b 0a 20 20 7d 0a  , &zTail8);.  }.
6810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6820: 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52  ABLE_SQLRR.  SRR
6830: 65 63 50 72 65 70 61 72 65 28 64 62 2c 20 7a 53  ecPrepare(db, zS
6840: 71 6c 38 2c 20 2d 31 2c 20 31 2c 20 2a 70 70 53  ql8, -1, 1, *ppS
6850: 74 6d 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  tmt);.#endif.  i
6860: 66 28 20 7a 54 61 69 6c 38 20 26 26 20 70 7a 54  f( zTail8 && pzT
6870: 61 69 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ail ){.    /* If
6880: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6890: 20 72 65 74 75 72 6e 73 20 61 20 74 61 69 6c 20   returns a tail 
68a0: 70 6f 69 6e 74 65 72 2c 20 77 65 20 63 61 6c 63  pointer, we calc
68b0: 75 6c 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ulate the.    **
68c0: 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 69 6e   equivalent poin
68d0: 74 65 72 20 69 6e 74 6f 20 74 68 65 20 55 54 46  ter into the UTF
68e0: 2d 31 36 20 73 74 72 69 6e 67 20 62 79 20 63 6f  -16 string by co
68f0: 75 6e 74 69 6e 67 20 74 68 65 20 75 6e 69 63 6f  unting the unico
6900: 64 65 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63  de.    ** charac
6910: 74 65 72 73 20 62 65 74 77 65 65 6e 20 7a 53 71  ters between zSq
6920: 6c 38 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20 61  l8 and zTail8, a
6930: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 69 6e  nd then returnin
6940: 67 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  g a pointer.    
6950: 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ** the same numb
6960: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
6970: 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31 36   into the UTF-16
6980: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a   string..    */.
6990: 20 20 20 20 69 6e 74 20 63 68 61 72 73 5f 70 61      int chars_pa
69a0: 72 73 65 64 20 3d 20 73 71 6c 69 74 65 33 55 74  rsed = sqlite3Ut
69b0: 66 38 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38 2c  f8CharLen(zSql8,
69c0: 20 28 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a 53   (int)(zTail8-zS
69d0: 71 6c 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54 61  ql8));.    *pzTa
69e0: 69 6c 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c 20  il = (u8 *)zSql 
69f0: 2b 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79  + sqlite3Utf16By
6a00: 74 65 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61 72  teLen(zSql, char
6a10: 73 5f 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a 20  s_parsed);.  }. 
6a20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6a30: 62 2c 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72 63  b, zSql8); .  rc
6a40: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
6a50: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
6a60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6a70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6a80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6a90: 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
6aa0: 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20  of the official 
6ab0: 41 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64  API.  Legacy and
6ac0: 20 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68   new use.  In th
6ad0: 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73  e legacy.** vers
6ae0: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
6af0: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f  l SQL text is no
6b00: 74 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70  t saved in the p
6b10: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6b20: 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61  t.** and so if a
6b30: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f   schema change o
6b40: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43  ccurs, SQLITE_SC
6b50: 48 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64  HEMA is returned
6b60: 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73   by.** sqlite3_s
6b70: 74 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e  tep().  In the n
6b80: 65 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ew version, the 
6b90: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
6ba0: 74 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a  t is retained.**
6bb0: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
6bc0: 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  nt is automatica
6bd0: 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69  lly recompiled i
6be0: 66 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e  f an schema chan
6bf0: 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  ge.** occurs..*/
6c00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  .int sqlite3_pre
6c10: 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65  pare16(.  sqlite
6c20: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6c30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6c40: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
6c50: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
6c60: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31          /* UTF-1
6c70: 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  6 encoded SQL st
6c80: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
6c90: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
6ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6cb0: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
6cc0: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
6cd0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
6ce0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
6cf0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
6d00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
6d10: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
6d20: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
6d30: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
6d40: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
6d50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
6d60: 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  = sqlite3Prepare
6d70: 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  16(db,zSql,nByte
6d80: 73 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69  s,0,ppStmt,pzTai
6d90: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
6da0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
6db0: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
6dc0: 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45  tmt==0 );  /* VE
6dd0: 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a  RIFY: F13021 */.
6de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
6df0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  nt sqlite3_prepa
6e00: 72 65 31 36 5f 76 32 28 0a 20 20 73 71 6c 69 74  re16_v2(.  sqlit
6e10: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6e20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6e30: 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63   handle. */ .  c
6e40: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c  onst void *zSql,
6e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
6e60: 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  16 encoded SQL s
6e70: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
6e80: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
6e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
6ea0: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
6eb0: 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tes. */.  sqlite
6ec0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
6ed0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
6ee0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
6ef0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
6f00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
6f10: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
6f20: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
6f30: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
6f40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
6f50: 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72   = sqlite3Prepar
6f60: 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  e16(db,zSql,nByt
6f70: 65 73 2c 31 2c 70 70 53 74 6d 74 2c 70 7a 54 61  es,1,ppStmt,pzTa
6f80: 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  il);.  assert( r
6f90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
6fa0: 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70  ppStmt==0 || *pp
6fb0: 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56  Stmt==0 );  /* V
6fc0: 45 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f  ERIFY: F13021 */
6fd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6fe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6ff0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.