/ Hex Artifact Content
Login

Artifact 0e9d4ae9d2493e6fc6aba8dc36722571136eb6f4ac235743cca8dc3403d0c347:


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: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
03c0: 20 29 7b 0a 20 20 20 20 70 44 61 74 61 2d 3e 72   ){.    pData->r
03d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
03e0: 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 20 69  _BKPT;.  }else i
03f0: 66 28 20 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d  f( pData->pzErrM
0400: 73 67 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20  sg[0]!=0 ){.    
0410: 2f 2a 20 41 20 65 72 72 6f 72 20 6d 65 73 73 61  /* A error messa
0420: 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
0430: 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20  een generated.  
0440: 44 6f 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  Do not overwrite
0450: 20 69 74 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69   it */.  }else i
0460: 66 28 20 70 44 61 74 61 2d 3e 6d 49 6e 69 74 46  f( pData->mInitF
0470: 6c 61 67 73 20 26 20 49 4e 49 54 46 4c 41 47 5f  lags & INITFLAG_
0480: 41 6c 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  AlterTable ){.  
0490: 20 20 2a 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d    *pData->pzErrM
04a0: 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
04b0: 72 44 75 70 28 64 62 2c 20 7a 45 78 74 72 61 29  rDup(db, zExtra)
04c0: 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 72 63 20  ;.    pData->rc 
04d0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
04e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
04f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
0500: 72 69 74 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  riteSchema ){.  
0510: 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 53 51    pData->rc = SQ
0520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
0530: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
0540: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
0550: 20 7a 4f 62 6a 3d 3d 30 20 29 20 7a 4f 62 6a 20   zObj==0 ) zObj 
0560: 3d 20 22 3f 22 3b 0a 20 20 20 20 7a 20 3d 20 73  = "?";.    z = s
0570: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
0580: 2c 20 22 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74  , "malformed dat
0590: 61 62 61 73 65 20 73 63 68 65 6d 61 20 28 25 73  abase schema (%s
05a0: 29 22 2c 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 69  )", zObj);.    i
05b0: 66 28 20 7a 45 78 74 72 61 20 26 26 20 7a 45 78  f( zExtra && zEx
05c0: 74 72 61 5b 30 5d 20 29 20 7a 20 3d 20 73 71 6c  tra[0] ) z = sql
05d0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
05e0: 22 25 7a 20 2d 20 25 73 22 2c 20 7a 2c 20 7a 45  "%z - %s", z, zE
05f0: 78 74 72 61 29 3b 0a 20 20 20 20 2a 70 44 61 74  xtra);.    *pDat
0600: 61 2d 3e 70 7a 45 72 72 4d 73 67 20 3d 20 7a 3b  a->pzErrMsg = z;
0610: 0a 20 20 20 20 70 44 61 74 61 2d 3e 72 63 20 3d  .    pData->rc =
0620: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
0630: 42 4b 50 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  BKPT;.  }.}../*.
0640: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
0650: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0660: 66 6f 72 20 74 68 65 20 63 6f 64 65 20 74 68 61  for the code tha
0670: 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  t initializes th
0680: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  e.** database.  
0690: 53 65 65 20 73 71 6c 69 74 65 33 49 6e 69 74 28  See sqlite3Init(
06a0: 29 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  ) below for addi
06b0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
06c0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
06d0: 69 6e 65 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c  ine is also call
06e0: 65 64 20 66 72 6f 6d 20 74 68 65 20 4f 50 5f 50  ed from the OP_P
06f0: 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64  arseSchema opcod
0700: 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a  e of the VDBE..*
0710: 2a 0a 2a 2a 20 45 61 63 68 20 63 61 6c 6c 62 61  *.** Each callba
0720: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ck contains the 
0730: 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d  following inform
0740: 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ation:.**.**    
0750: 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20   argv[0] = name 
0760: 6f 66 20 74 68 69 6e 67 20 62 65 69 6e 67 20 63  of thing being c
0770: 72 65 61 74 65 64 0a 2a 2a 20 20 20 20 20 61 72  reated.**     ar
0780: 67 76 5b 31 5d 20 3d 20 72 6f 6f 74 20 70 61 67  gv[1] = root pag
0790: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  e number for tab
07a0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 30 20 66  le or index. 0 f
07b0: 6f 72 20 74 72 69 67 67 65 72 20 6f 72 20 76 69  or trigger or vi
07c0: 65 77 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  ew..**     argv[
07d0: 32 5d 20 3d 20 53 51 4c 20 74 65 78 74 20 66 6f  2] = SQL text fo
07e0: 72 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  r the CREATE sta
07f0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  tement..**.*/.in
0800: 74 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c  t sqlite3InitCal
0810: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69  lback(void *pIni
0820: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  t, int argc, cha
0830: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
0840: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 49 6e 69  *NotUsed){.  Ini
0850: 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28  tData *pData = (
0860: 49 6e 69 74 44 61 74 61 2a 29 70 49 6e 69 74 3b  InitData*)pInit;
0870: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0880: 20 70 44 61 74 61 2d 3e 64 62 3b 0a 20 20 69 6e   pData->db;.  in
0890: 74 20 69 44 62 20 3d 20 70 44 61 74 61 2d 3e 69  t iDb = pData->i
08a0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  Db;..  assert( a
08b0: 72 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53  rgc==3 );.  UNUS
08c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
08d0: 74 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 20 20  tUsed, argc);.  
08e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
08f0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
0900: 75 74 65 78 29 20 29 3b 0a 20 20 44 62 43 6c 65  utex) );.  DbCle
0910: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
0920: 44 62 2c 20 44 42 5f 45 6d 70 74 79 29 3b 0a 20  Db, DB_Empty);. 
0930: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
0940: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 63 6f 72  ailed ){.    cor
0950: 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61  ruptSchema(pData
0960: 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20  , argv[0], 0);. 
0970: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0980: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
0990: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
09a0: 62 20 29 3b 0a 20 20 69 66 28 20 61 72 67 76 3d  b );.  if( argv=
09b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
09c0: 20 2f 2a 20 4d 69 67 68 74 20 68 61 70 70 65 6e   /* Might happen
09d0: 20 69 66 20 45 4d 50 54 59 5f 52 45 53 55 4c 54   if EMPTY_RESULT
09e0: 5f 43 41 4c 4c 42 41 43 4b 53 20 61 72 65 20 6f  _CALLBACKS are o
09f0: 6e 20 2a 2f 0a 20 20 69 66 28 20 61 72 67 76 5b  n */.  if( argv[
0a00: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 72  1]==0 ){.    cor
0a10: 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61  ruptSchema(pData
0a20: 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20  , argv[0], 0);. 
0a30: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
0a40: 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76  e3_strnicmp(argv
0a50: 5b 32 5d 2c 22 63 72 65 61 74 65 20 22 2c 37 29  [2],"create ",7)
0a60: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ==0 ){.    /* Ca
0a70: 6c 6c 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  ll the parser to
0a80: 20 70 72 6f 63 65 73 73 20 61 20 43 52 45 41 54   process a CREAT
0a90: 45 20 54 41 42 4c 45 2c 20 49 4e 44 45 58 20 6f  E TABLE, INDEX o
0aa0: 72 20 56 49 45 57 2e 0a 20 20 20 20 2a 2a 20 42  r VIEW..    ** B
0ab0: 75 74 20 62 65 63 61 75 73 65 20 64 62 2d 3e 69  ut because db->i
0ac0: 6e 69 74 2e 62 75 73 79 20 69 73 20 73 65 74 20  nit.busy is set 
0ad0: 74 6f 20 31 2c 20 6e 6f 20 56 44 42 45 20 63 6f  to 1, no VDBE co
0ae0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 0a  de is generated.
0af0: 20 20 20 20 2a 2a 20 6f 72 20 65 78 65 63 75 74      ** or execut
0b00: 65 64 2e 20 20 41 6c 6c 20 74 68 65 20 70 61 72  ed.  All the par
0b10: 73 65 72 20 64 6f 65 73 20 69 73 20 62 75 69 6c  ser does is buil
0b20: 64 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64  d the internal d
0b30: 61 74 61 0a 20 20 20 20 2a 2a 20 73 74 72 75 63  ata.    ** struc
0b40: 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
0b50: 69 62 65 20 74 68 65 20 74 61 62 6c 65 2c 20 69  ibe the table, i
0b60: 6e 64 65 78 2c 20 6f 72 20 76 69 65 77 2e 0a 20  ndex, or view.. 
0b70: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
0b80: 3b 0a 20 20 20 20 75 38 20 73 61 76 65 64 5f 69  ;.    u8 saved_i
0b90: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
0ba0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  b;.    sqlite3_s
0bb0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
0bc0: 54 45 53 54 4f 4e 4c 59 28 69 6e 74 20 72 63 70  TESTONLY(int rcp
0bd0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
0be0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
0bf0: 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  m sqlite3_prepar
0c00: 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e() */..    asse
0c10: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
0c20: 79 20 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69  y );.    db->ini
0c30: 74 2e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  t.iDb = iDb;.   
0c40: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
0c50: 6d 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28  m = sqlite3Atoi(
0c60: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 64 62  argv[1]);.    db
0c70: 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69  ->init.orphanTri
0c80: 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 54 45  gger = 0;.    TE
0c90: 53 54 4f 4e 4c 59 28 72 63 70 20 3d 20 29 20 73  STONLY(rcp = ) s
0ca0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
0cb0: 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20  b, argv[2], -1, 
0cc0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
0cd0: 72 63 20 3d 20 64 62 2d 3e 65 72 72 43 6f 64 65  rc = db->errCode
0ce0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
0cf0: 63 26 30 78 46 46 29 3d 3d 28 72 63 70 26 30 78  c&0xFF)==(rcp&0x
0d00: 46 46 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e 69  FF) );.    db->i
0d10: 6e 69 74 2e 69 44 62 20 3d 20 73 61 76 65 64 5f  nit.iDb = saved_
0d20: 69 44 62 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  iDb;.    /* asse
0d30: 72 74 28 20 73 61 76 65 64 5f 69 44 62 3d 3d 30  rt( saved_iDb==0
0d40: 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67   || (db->mDbFlag
0d50: 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75  s & DBFLAG_Vacuu
0d60: 6d 29 21 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20  m)!=0 ); */.    
0d70: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
0d80: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  c ){.      if( d
0d90: 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72  b->init.orphanTr
0da0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
0db0: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20   assert( iDb==1 
0dc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
0dd0: 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 72          pData->r
0de0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
0df0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
0e00: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  OMEM ){.        
0e10: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
0e20: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  t(db);.        }
0e30: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
0e40: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 26 26  ITE_INTERRUPT &&
0e50: 20 28 72 63 26 30 78 46 46 29 21 3d 53 51 4c 49   (rc&0xFF)!=SQLI
0e60: 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
0e70: 20 20 20 20 20 20 20 63 6f 72 72 75 70 74 53 63         corruptSc
0e80: 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76  hema(pData, argv
0e90: 5b 30 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  [0], sqlite3_err
0ea0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
0eb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0ec0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
0ed0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
0ee0: 20 7d 65 6c 73 65 20 69 66 28 20 61 72 67 76 5b   }else if( argv[
0ef0: 30 5d 3d 3d 30 20 7c 7c 20 28 61 72 67 76 5b 32  0]==0 || (argv[2
0f00: 5d 21 3d 30 20 26 26 20 61 72 67 76 5b 32 5d 5b  ]!=0 && argv[2][
0f10: 30 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 63 6f  0]!=0) ){.    co
0f20: 72 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74  rruptSchema(pDat
0f30: 61 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  a, argv[0], 0);.
0f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
0f50: 49 66 20 74 68 65 20 53 51 4c 20 63 6f 6c 75 6d  If the SQL colum
0f60: 6e 20 69 73 20 62 6c 61 6e 6b 20 69 74 20 6d 65  n is blank it me
0f70: 61 6e 73 20 74 68 69 73 20 69 73 20 61 6e 20 69  ans this is an i
0f80: 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a  ndex that.    **
0f90: 20 77 61 73 20 63 72 65 61 74 65 64 20 74 6f 20   was created to 
0fa0: 62 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  be the PRIMARY K
0fb0: 45 59 20 6f 72 20 74 6f 20 66 75 6c 66 69 6c 6c  EY or to fulfill
0fc0: 20 61 20 55 4e 49 51 55 45 0a 20 20 20 20 2a 2a   a UNIQUE.    **
0fd0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20   constraint for 
0fe0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 2e 20  a CREATE TABLE. 
0ff0: 20 54 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   The index shoul
1000: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  d have already. 
1010: 20 20 20 2a 2a 20 62 65 65 6e 20 63 72 65 61 74     ** been creat
1020: 65 64 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  ed when we proce
1030: 73 73 65 64 20 74 68 65 20 43 52 45 41 54 45 20  ssed the CREATE 
1040: 54 41 42 4c 45 2e 20 20 41 6c 6c 20 77 65 20 68  TABLE.  All we h
1050: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f  ave.    ** to do
1060: 20 68 65 72 65 20 69 73 20 72 65 63 6f 72 64 20   here is record 
1070: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
1080: 6d 62 65 72 20 66 6f 72 20 74 68 61 74 20 69 6e  mber for that in
1090: 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
10a0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
10b0: 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69     pIndex = sqli
10c0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
10d0: 20 61 72 67 76 5b 30 5d 2c 20 64 62 2d 3e 61 44   argv[0], db->aD
10e0: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29  b[iDb].zDbSName)
10f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
1100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1110: 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69  This can occur i
1120: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
1130: 6e 20 69 6e 64 65 78 20 6f 6e 20 61 20 54 45 4d  n index on a TEM
1140: 50 20 74 61 62 6c 65 20 77 68 69 63 68 0a 20 20  P table which.  
1150: 20 20 20 20 2a 2a 20 68 61 73 20 74 68 65 20 73      ** has the s
1160: 61 6d 65 20 6e 61 6d 65 20 61 73 20 61 6e 6f 74  ame name as anot
1170: 68 65 72 20 69 6e 64 65 78 20 6f 6e 20 61 20 70  her index on a p
1180: 65 72 6d 61 6e 65 6e 74 20 69 6e 64 65 78 2e 20  ermanent index. 
1190: 20 53 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   Since.      ** 
11a0: 74 68 65 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  the permanent ta
11b0: 62 6c 65 20 69 73 20 68 69 64 64 65 6e 20 62 79  ble is hidden by
11c0: 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 2c   the TEMP table,
11d0: 20 77 65 20 63 61 6e 20 61 6c 73 6f 0a 20 20 20   we can also.   
11e0: 20 20 20 2a 2a 20 73 61 66 65 6c 79 20 69 67 6e     ** safely ign
11f0: 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ore the index on
1200: 20 74 68 65 20 70 65 72 6d 61 6e 65 6e 74 20 74   the permanent t
1210: 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
1220: 20 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69       /* Do Nothi
1230: 6e 67 20 2a 2f 3b 0a 20 20 20 20 7d 65 6c 73 65  ng */;.    }else
1240: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
1250: 6e 74 33 32 28 61 72 67 76 5b 31 5d 2c 20 26 70  nt32(argv[1], &p
1260: 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3d 3d 30 20  Index->tnum)==0 
1270: 29 7b 0a 20 20 20 20 20 20 63 6f 72 72 75 70 74  ){.      corrupt
1280: 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72  Schema(pData, ar
1290: 67 76 5b 30 5d 2c 20 22 69 6e 76 61 6c 69 64 20  gv[0], "invalid 
12a0: 72 6f 6f 74 70 61 67 65 22 29 3b 0a 20 20 20 20  rootpage");.    
12b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
12c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
12d0: 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 20 64  pt to read the d
12e0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 61  atabase schema a
12f0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 6e  nd initialize in
1300: 74 65 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 73  ternal.** data s
1310: 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 61 20  tructures for a 
1320: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1330: 66 69 6c 65 2e 20 20 54 68 65 20 69 6e 64 65 78  file.  The index
1340: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1350: 61 73 65 20 66 69 6c 65 20 69 73 20 67 69 76 65  ase file is give
1360: 6e 20 62 79 20 69 44 62 2e 20 20 69 44 62 3d 3d  n by iDb.  iDb==
1370: 30 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68  0 is used for th
1380: 65 20 6d 61 69 6e 0a 2a 2a 20 64 61 74 61 62 61  e main.** databa
1390: 73 65 2e 20 20 69 44 62 3d 3d 31 20 73 68 6f 75  se.  iDb==1 shou
13a0: 6c 64 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ld never be used
13b0: 2e 20 20 69 44 62 3e 3d 32 20 69 73 20 75 73 65  .  iDb>=2 is use
13c0: 64 20 66 6f 72 0a 2a 2a 20 61 75 78 69 6c 69 61  d for.** auxilia
13d0: 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 52  ry databases.  R
13e0: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
13f0: 20 53 51 4c 49 54 45 5f 20 65 72 72 6f 72 20 63   SQLITE_ error c
1400: 6f 64 65 73 20 74 6f 0a 2a 2a 20 69 6e 64 69 63  odes to.** indic
1410: 61 74 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  ate success or f
1420: 61 69 6c 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ailure..*/.int s
1430: 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 73 71  qlite3InitOne(sq
1440: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
1450: 44 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  Db, char **pzErr
1460: 4d 73 67 2c 20 75 33 32 20 6d 46 6c 61 67 73 29  Msg, u32 mFlags)
1470: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
1480: 74 20 69 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  t i;.#ifndef SQL
1490: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
14a0: 54 45 44 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a  TED.  int size;.
14b0: 23 65 6e 64 69 66 0a 20 20 44 62 20 2a 70 44 62  #endif.  Db *pDb
14c0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
14d0: 61 7a 41 72 67 5b 34 5d 3b 0a 20 20 69 6e 74 20  azArg[4];.  int 
14e0: 6d 65 74 61 5b 35 5d 3b 0a 20 20 49 6e 69 74 44  meta[5];.  InitD
14f0: 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 20 20  ata initData;.  
1500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1510: 74 65 72 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f  terName;.  int o
1520: 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e  penedTransaction
1530: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1540: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
1550: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e   DBFLAG_SchemaKn
1560: 6f 77 6e 4f 6b 29 3d 3d 30 20 29 3b 0a 20 20 61  ownOk)==0 );.  a
1570: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
1580: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1590: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
15a0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 20 29  b[iDb].pSchema )
15b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
15d0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
15e0: 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c  ssert( iDb==1 ||
15f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1600: 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b  dsMutex(db->aDb[
1610: 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 0a 20 20  iDb].pBt) );..  
1620: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
1630: 31 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  1;..  /* Constru
1640: 63 74 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ct the in-memory
1650: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1660: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 28 73  schema tables (s
1670: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 0a  qlite_master or.
1680: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
1690: 5f 6d 61 73 74 65 72 29 20 62 79 20 69 6e 76 6f  _master) by invo
16a0: 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65 72 20  king the parser 
16b0: 64 69 72 65 63 74 6c 79 2e 20 20 54 68 65 20 61  directly.  The a
16c0: 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20  ppropriate.  ** 
16d0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20  table name will 
16e0: 62 65 20 69 6e 73 65 72 74 65 64 20 61 75 74 6f  be inserted auto
16f0: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
1700: 20 70 61 72 73 65 72 20 73 6f 20 77 65 20 63 61   parser so we ca
1710: 6e 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  n just.  ** use 
1720: 74 68 65 20 61 62 62 72 65 76 69 61 74 69 6f 6e  the abbreviation
1730: 20 22 78 22 20 68 65 72 65 2e 20 20 54 68 65 20   "x" here.  The 
1740: 70 61 72 73 65 72 20 77 69 6c 6c 20 61 6c 73 6f  parser will also
1750: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74   automatically t
1760: 61 67 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  ag.  ** the sche
1770: 6d 61 20 74 61 62 6c 65 20 61 73 20 72 65 61 64  ma table as read
1780: 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 61 7a 41 72  -only. */.  azAr
1790: 67 5b 30 5d 20 3d 20 7a 4d 61 73 74 65 72 4e 61  g[0] = zMasterNa
17a0: 6d 65 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  me = SCHEMA_TABL
17b0: 45 28 69 44 62 29 3b 0a 20 20 61 7a 41 72 67 5b  E(iDb);.  azArg[
17c0: 31 5d 20 3d 20 22 31 22 3b 0a 20 20 61 7a 41 72  1] = "1";.  azAr
17d0: 67 5b 32 5d 20 3d 20 22 43 52 45 41 54 45 20 54  g[2] = "CREATE T
17e0: 41 42 4c 45 20 78 28 74 79 70 65 20 74 65 78 74  ABLE x(type text
17f0: 2c 6e 61 6d 65 20 74 65 78 74 2c 74 62 6c 5f 6e  ,name text,tbl_n
1800: 61 6d 65 20 74 65 78 74 2c 22 0a 20 20 20 20 20  ame text,".     
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 22 72 6f 6f 74 70 61 67 65         "rootpage
1830: 20 69 6e 74 2c 73 71 6c 20 74 65 78 74 29 22 3b   int,sql text)";
1840: 0a 20 20 61 7a 41 72 67 5b 33 5d 20 3d 20 30 3b  .  azArg[3] = 0;
1850: 0a 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d  .  initData.db =
1860: 20 64 62 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e   db;.  initData.
1870: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 6e 69  iDb = iDb;.  ini
1880: 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54  tData.rc = SQLIT
1890: 45 5f 4f 4b 3b 0a 20 20 69 6e 69 74 44 61 74 61  E_OK;.  initData
18a0: 2e 70 7a 45 72 72 4d 73 67 20 3d 20 70 7a 45 72  .pzErrMsg = pzEr
18b0: 72 4d 73 67 3b 0a 20 20 69 6e 69 74 44 61 74 61  rMsg;.  initData
18c0: 2e 6d 49 6e 69 74 46 6c 61 67 73 20 3d 20 6d 46  .mInitFlags = mF
18d0: 6c 61 67 73 3b 0a 20 20 73 71 6c 69 74 65 33 49  lags;.  sqlite3I
18e0: 6e 69 74 43 61 6c 6c 62 61 63 6b 28 26 69 6e 69  nitCallback(&ini
18f0: 74 44 61 74 61 2c 20 33 2c 20 28 63 68 61 72 20  tData, 3, (char 
1900: 2a 2a 29 61 7a 41 72 67 2c 20 30 29 3b 0a 20 20  **)azArg, 0);.  
1910: 69 66 28 20 69 6e 69 74 44 61 74 61 2e 72 63 20  if( initData.rc 
1920: 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69 74  ){.    rc = init
1930: 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 67 6f 74  Data.rc;.    got
1940: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1950: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
1960: 63 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64 20 74  cursor to hold t
1970: 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1980: 0a 20 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  .  */.  pDb = &d
1990: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 69  b->aDb[iDb];.  i
19a0: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
19b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
19c0: 62 3d 3d 31 20 29 3b 0a 20 20 20 20 44 62 53 65  b==1 );.    DbSe
19d0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c  tProperty(db, 1,
19e0: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
19f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1a00: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
1a10: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1a20: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1a30: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 72   not already a r
1a40: 65 61 64 2d 6f 6e 6c 79 20 28 6f 72 20 72 65 61  ead-only (or rea
1a50: 64 2d 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  d-write) transac
1a60: 74 69 6f 6e 20 6f 70 65 6e 65 64 0a 20 20 2a 2a  tion opened.  **
1a70: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 64   on the b-tree d
1a80: 61 74 61 62 61 73 65 2c 20 6f 70 65 6e 20 6f 6e  atabase, open on
1a90: 65 20 6e 6f 77 2e 20 49 66 20 61 20 74 72 61 6e  e now. If a tran
1aa0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
1ab0: 64 2c 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c 6c  d, it .  ** will
1ac0: 20 62 65 20 63 6c 6f 73 65 64 20 62 65 66 6f 72   be closed befor
1ad0: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1ae0: 72 65 74 75 72 6e 73 2e 20 20 2a 2f 0a 20 20 73  returns.  */.  s
1af0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b00: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 69 66  (pDb->pBt);.  if
1b10: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  ( !sqlite3BtreeI
1b20: 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 44 62  sInReadTrans(pDb
1b30: 2d 3e 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63  ->pBt) ){.    rc
1b40: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
1b50: 65 67 69 6e 54 72 61 6e 73 28 70 44 62 2d 3e 70  eginTrans(pDb->p
1b60: 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
1b70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b90: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
1ba0: 4d 73 67 2c 20 64 62 2c 20 73 71 6c 69 74 65 33  Msg, db, sqlite3
1bb0: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
1bc0: 20 20 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f     goto initone_
1bd0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
1be0: 0a 20 20 20 20 6f 70 65 6e 65 64 54 72 61 6e 73  .    openedTrans
1bf0: 61 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a  action = 1;.  }.
1c00: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 64 61  .  /* Get the da
1c10: 74 61 62 61 73 65 20 6d 65 74 61 20 69 6e 66 6f  tabase meta info
1c20: 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  rmation..  **.  
1c30: 2a 2a 20 4d 65 74 61 20 76 61 6c 75 65 73 20 61  ** Meta values a
1c40: 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  re as follows:. 
1c50: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 30 5d 20 20   **    meta[0]  
1c60: 20 53 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20   Schema cookie. 
1c70: 20 43 68 61 6e 67 65 73 20 77 69 74 68 20 65 61   Changes with ea
1c80: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
1c90: 2e 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 31  ..  **    meta[1
1ca0: 5d 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20  ]   File format 
1cb0: 6f 66 20 73 63 68 65 6d 61 20 6c 61 79 65 72 2e  of schema layer.
1cc0: 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 32 5d  .  **    meta[2]
1cd0: 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70     Size of the p
1ce0: 61 67 65 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  age cache..  ** 
1cf0: 20 20 20 6d 65 74 61 5b 33 5d 20 20 20 4c 61 72     meta[3]   Lar
1d00: 67 65 73 74 20 72 6f 6f 74 70 61 67 65 20 28 61  gest rootpage (a
1d10: 75 74 6f 2f 69 6e 63 72 5f 76 61 63 75 75 6d 20  uto/incr_vacuum 
1d20: 6d 6f 64 65 29 0a 20 20 2a 2a 20 20 20 20 6d 65  mode).  **    me
1d30: 74 61 5b 34 5d 20 20 20 44 62 20 74 65 78 74 20  ta[4]   Db text 
1d40: 65 6e 63 6f 64 69 6e 67 2e 20 31 3a 55 54 46 2d  encoding. 1:UTF-
1d50: 38 20 32 3a 55 54 46 2d 31 36 4c 45 20 33 3a 55  8 2:UTF-16LE 3:U
1d60: 54 46 2d 31 36 42 45 0a 20 20 2a 2a 20 20 20 20  TF-16BE.  **    
1d70: 6d 65 74 61 5b 35 5d 20 20 20 55 73 65 72 20 76  meta[5]   User v
1d80: 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6d  ersion.  **    m
1d90: 65 74 61 5b 36 5d 20 20 20 49 6e 63 72 65 6d 65  eta[6]   Increme
1da0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 6d 6f 64 65  ntal vacuum mode
1db0: 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 37 5d  .  **    meta[7]
1dc0: 20 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20     unused.  **  
1dd0: 20 20 6d 65 74 61 5b 38 5d 20 20 20 75 6e 75 73    meta[8]   unus
1de0: 65 64 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b  ed.  **    meta[
1df0: 39 5d 20 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a  9]   unused.  **
1e00: 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 65 20  .  ** Note: The 
1e10: 23 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f  #defined SQLITE_
1e20: 55 54 46 2a 20 73 79 6d 62 6f 6c 73 20 69 6e 20  UTF* symbols in 
1e30: 73 71 6c 69 74 65 49 6e 74 2e 68 20 63 6f 72 72  sqliteInt.h corr
1e40: 65 73 70 6f 6e 64 20 74 6f 0a 20 20 2a 2a 20 74  espond to.  ** t
1e50: 68 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75  he possible valu
1e60: 65 73 20 6f 66 20 6d 65 74 61 5b 34 5d 2e 0a 20  es of meta[4].. 
1e70: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1e80: 3c 41 72 72 61 79 53 69 7a 65 28 6d 65 74 61 29  <ArraySize(meta)
1e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1ea0: 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
1eb0: 70 44 62 2d 3e 70 42 74 2c 20 69 2b 31 2c 20 28  pDb->pBt, i+1, (
1ec0: 75 33 32 20 2a 29 26 6d 65 74 61 5b 69 5d 29 3b  u32 *)&meta[i]);
1ed0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 64 62 2d 3e  .  }.  if( (db->
1ee0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
1ef0: 65 73 65 74 44 61 74 61 62 61 73 65 29 21 3d 30  esetDatabase)!=0
1f00: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6d   ){.    memset(m
1f10: 65 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  eta, 0, sizeof(m
1f20: 65 74 61 29 29 3b 0a 20 20 7d 0a 20 20 70 44 62  eta));.  }.  pDb
1f30: 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
1f40: 61 5f 63 6f 6f 6b 69 65 20 3d 20 6d 65 74 61 5b  a_cookie = meta[
1f50: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
1f60: 53 49 4f 4e 2d 31 5d 3b 0a 0a 20 20 2f 2a 20 49  SION-1];..  /* I
1f70: 66 20 6f 70 65 6e 69 6e 67 20 61 20 6e 6f 6e 2d  f opening a non-
1f80: 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1f90: 63 68 65 63 6b 20 74 68 65 20 74 65 78 74 20 65  check the text e
1fa0: 6e 63 6f 64 69 6e 67 2e 20 46 6f 72 20 74 68 65  ncoding. For the
1fb0: 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62  .  ** main datab
1fc0: 61 73 65 2c 20 73 65 74 20 73 71 6c 69 74 65 33  ase, set sqlite3
1fd0: 2e 65 6e 63 20 74 6f 20 74 68 65 20 65 6e 63 6f  .enc to the enco
1fe0: 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e  ding of the main
1ff0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20   database..  ** 
2000: 46 6f 72 20 61 6e 20 61 74 74 61 63 68 65 64 20  For an attached 
2010: 64 62 2c 20 69 74 20 69 73 20 61 6e 20 65 72 72  db, it is an err
2020: 6f 72 20 69 66 20 74 68 65 20 65 6e 63 6f 64 69  or if the encodi
2030: 6e 67 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  ng is not the sa
2040: 6d 65 0a 20 20 2a 2a 20 61 73 20 73 71 6c 69 74  me.  ** as sqlit
2050: 65 33 2e 65 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69  e3.enc..  */.  i
2060: 66 28 20 6d 65 74 61 5b 42 54 52 45 45 5f 54 45  f( meta[BTREE_TE
2070: 58 54 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 20 29  XT_ENCODING-1] )
2080: 7b 20 20 2f 2a 20 74 65 78 74 20 65 6e 63 6f 64  {  /* text encod
2090: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ing */.    if( i
20a0: 44 62 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  Db==0 ){.#ifndef
20b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
20c0: 31 36 0a 20 20 20 20 20 20 75 38 20 65 6e 63 6f  16.      u8 enco
20d0: 64 69 6e 67 3b 0a 20 20 20 20 20 20 2f 2a 20 49  ding;.      /* I
20e0: 66 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6d 61  f opening the ma
20f0: 69 6e 20 64 61 74 61 62 61 73 65 2c 20 73 65 74  in database, set
2100: 20 45 4e 43 28 64 62 29 2e 20 2a 2f 0a 20 20 20   ENC(db). */.   
2110: 20 20 20 65 6e 63 6f 64 69 6e 67 20 3d 20 28 75     encoding = (u
2120: 38 29 6d 65 74 61 5b 42 54 52 45 45 5f 54 45 58  8)meta[BTREE_TEX
2130: 54 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 20 26 20  T_ENCODING-1] & 
2140: 33 3b 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63  3;.      if( enc
2150: 6f 64 69 6e 67 3d 3d 30 20 29 20 65 6e 63 6f 64  oding==0 ) encod
2160: 69 6e 67 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  ing = SQLITE_UTF
2170: 38 3b 0a 20 20 20 20 20 20 45 4e 43 28 64 62 29  8;.      ENC(db)
2180: 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 23 65 6c   = encoding;.#el
2190: 73 65 0a 20 20 20 20 20 20 45 4e 43 28 64 62 29  se.      ENC(db)
21a0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
21b0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
21c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6f 70  {.      /* If op
21d0: 65 6e 69 6e 67 20 61 6e 20 61 74 74 61 63 68 65  ening an attache
21e0: 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
21f0: 65 6e 63 6f 64 69 6e 67 20 6d 75 63 68 20 6d 61  encoding much ma
2200: 74 63 68 20 45 4e 43 28 64 62 29 20 2a 2f 0a 20  tch ENC(db) */. 
2210: 20 20 20 20 20 69 66 28 20 6d 65 74 61 5b 42 54       if( meta[BT
2220: 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e  REE_TEXT_ENCODIN
2230: 47 2d 31 5d 21 3d 45 4e 43 28 64 62 29 20 29 7b  G-1]!=ENC(db) ){
2240: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2250: 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
2260: 73 67 2c 20 64 62 2c 20 22 61 74 74 61 63 68 65  sg, db, "attache
2270: 64 20 64 61 74 61 62 61 73 65 73 20 6d 75 73 74  d databases must
2280: 20 75 73 65 20 74 68 65 20 73 61 6d 65 22 0a 20   use the same". 
2290: 20 20 20 20 20 20 20 20 20 20 20 22 20 74 65 78             " tex
22a0: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 6d 61  t encoding as ma
22b0: 69 6e 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  in database");. 
22c0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
22e0: 20 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65    goto initone_e
22f0: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  rror_out;.      
2300: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
2310: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
2320: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 45  ty(db, iDb, DB_E
2330: 6d 70 74 79 29 3b 0a 20 20 7d 0a 20 20 70 44 62  mpty);.  }.  pDb
2340: 2d 3e 70 53 63 68 65 6d 61 2d 3e 65 6e 63 20 3d  ->pSchema->enc =
2350: 20 45 4e 43 28 64 62 29 3b 0a 0a 20 20 69 66 28   ENC(db);..  if(
2360: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
2370: 61 63 68 65 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  ache_size==0 ){.
2380: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2390: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
23a0: 20 20 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65     size = sqlite
23b0: 33 41 62 73 49 6e 74 33 32 28 6d 65 74 61 5b 42  3AbsInt32(meta[B
23c0: 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  TREE_DEFAULT_CAC
23d0: 48 45 5f 53 49 5a 45 2d 31 5d 29 3b 0a 20 20 20  HE_SIZE-1]);.   
23e0: 20 69 66 28 20 73 69 7a 65 3d 3d 30 20 29 7b 20   if( size==0 ){ 
23f0: 73 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  size = SQLITE_DE
2400: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
2410: 3b 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 53 63  ; }.    pDb->pSc
2420: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
2430: 20 3d 20 73 69 7a 65 3b 0a 23 65 6c 73 65 0a 20   = size;.#else. 
2440: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
2450: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 53 51  >cache_size = SQ
2460: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
2470: 48 45 5f 53 49 5a 45 3b 0a 23 65 6e 64 69 66 0a  HE_SIZE;.#endif.
2480: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2490: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
24a0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
24b0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
24c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
24d0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 31 20   file_format==1 
24e0: 20 20 20 56 65 72 73 69 6f 6e 20 33 2e 30 2e 30     Version 3.0.0
24f0: 2e 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d  ..  ** file_form
2500: 61 74 3d 3d 32 20 20 20 20 56 65 72 73 69 6f 6e  at==2    Version
2510: 20 33 2e 31 2e 33 2e 20 20 2f 2f 20 41 4c 54 45   3.1.3.  // ALTE
2520: 52 20 54 41 42 4c 45 20 41 44 44 20 43 4f 4c 55  R TABLE ADD COLU
2530: 4d 4e 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72  MN.  ** file_for
2540: 6d 61 74 3d 3d 33 20 20 20 20 56 65 72 73 69 6f  mat==3    Versio
2550: 6e 20 33 2e 31 2e 34 2e 20 20 2f 2f 20 64 69 74  n 3.1.4.  // dit
2560: 74 6f 20 62 75 74 20 77 69 74 68 20 6e 6f 6e 2d  to but with non-
2570: 4e 55 4c 4c 20 64 65 66 61 75 6c 74 73 0a 20 20  NULL defaults.  
2580: 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d  ** file_format==
2590: 34 20 20 20 20 56 65 72 73 69 6f 6e 20 33 2e 33  4    Version 3.3
25a0: 2e 30 2e 20 20 2f 2f 20 44 45 53 43 20 69 6e 64  .0.  // DESC ind
25b0: 69 63 65 73 2e 20 20 42 6f 6f 6c 65 61 6e 20 63  ices.  Boolean c
25c0: 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
25d0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
25e0: 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29  le_format = (u8)
25f0: 6d 65 74 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f  meta[BTREE_FILE_
2600: 46 4f 52 4d 41 54 2d 31 5d 3b 0a 20 20 69 66 28  FORMAT-1];.  if(
2610: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
2620: 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 30 20 29 7b  ile_format==0 ){
2630: 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d  .    pDb->pSchem
2640: 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d  a->file_format =
2650: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   1;.  }.  if( pD
2660: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
2670: 5f 66 6f 72 6d 61 74 3e 53 51 4c 49 54 45 5f 4d  _format>SQLITE_M
2680: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29  AX_FILE_FORMAT )
2690: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
26a0: 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
26b0: 20 64 62 2c 20 22 75 6e 73 75 70 70 6f 72 74 65   db, "unsupporte
26c0: 64 20 66 69 6c 65 20 66 6f 72 6d 61 74 22 29 3b  d file format");
26d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f  _ERROR;.    goto
26f0: 20 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f   initone_error_o
2700: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 69  ut;.  }..  /* Ti
2710: 63 6b 65 74 20 23 32 38 30 34 3a 20 20 57 68 65  cket #2804:  Whe
2720: 6e 20 77 65 20 6f 70 65 6e 20 61 20 64 61 74 61  n we open a data
2730: 62 61 73 65 20 69 6e 20 74 68 65 20 6e 65 77 65  base in the newe
2740: 72 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 20  r file format,. 
2750: 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 6c 65   ** clear the le
2760: 67 61 63 79 5f 66 69 6c 65 5f 66 6f 72 6d 61 74  gacy_file_format
2770: 20 70 72 61 67 6d 61 20 66 6c 61 67 20 73 6f 20   pragma flag so 
2780: 74 68 61 74 20 61 20 56 41 43 55 55 4d 20 77 69  that a VACUUM wi
2790: 6c 6c 0a 20 20 2a 2a 20 6e 6f 74 20 64 6f 77 6e  ll.  ** not down
27a0: 67 72 61 64 65 20 74 68 65 20 64 61 74 61 62 61  grade the databa
27b0: 73 65 20 61 6e 64 20 74 68 75 73 20 69 6e 76 61  se and thus inva
27c0: 6c 69 64 61 74 65 20 61 6e 79 20 64 65 73 63 65  lidate any desce
27d0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 69 63  nding.  ** indic
27e0: 65 73 20 74 68 61 74 20 74 68 65 20 75 73 65 72  es that the user
27f0: 20 6d 69 67 68 74 20 68 61 76 65 20 63 72 65 61   might have crea
2800: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
2810: 69 44 62 3d 3d 30 20 26 26 20 6d 65 74 61 5b 42  iDb==0 && meta[B
2820: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
2830: 2d 31 5d 3e 3d 34 20 29 7b 0a 20 20 20 20 64 62  -1]>=4 ){.    db
2840: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
2850: 29 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69  )SQLITE_LegacyFi
2860: 6c 65 46 6d 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  leFmt;.  }..  /*
2870: 20 52 65 61 64 20 74 68 65 20 73 63 68 65 6d 61   Read the schema
2880: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
2890: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74   of the schema t
28a0: 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 61 73 73  ables.  */.  ass
28b0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
28c0: 73 79 20 29 3b 0a 20 20 7b 0a 20 20 20 20 63 68  sy );.  {.    ch
28d0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 7a 53  ar *zSql;.    zS
28e0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
28f0: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
2900: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72   "SELECT name, r
2910: 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f  ootpage, sql FRO
2920: 4d 20 5c 22 25 77 5c 22 2e 25 73 20 4f 52 44 45  M \"%w\".%s ORDE
2930: 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20  R BY rowid",.   
2940: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
2950: 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73  ].zDbSName, zMas
2960: 74 65 72 4e 61 6d 65 29 3b 0a 23 69 66 6e 64 65  terName);.#ifnde
2970: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2980: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
2990: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29a0: 78 61 75 74 68 20 78 41 75 74 68 3b 0a 20 20 20  xauth xAuth;.   
29b0: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
29c0: 41 75 74 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Auth;.      db->
29d0: 78 41 75 74 68 20 3d 20 30 3b 0a 23 65 6e 64 69  xAuth = 0;.#endi
29e0: 66 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  f.      rc = sql
29f0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
2a00: 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43  ql, sqlite3InitC
2a10: 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61  allback, &initDa
2a20: 74 61 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  ta, 0);.#ifndef 
2a30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2a40: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20  ORIZATION.      
2a50: 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
2a60: 68 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  h;.    }.#endif.
2a70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a80: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69  TE_OK ) rc = ini
2a90: 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 73 71  tData.rc;.    sq
2aa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2ab0: 7a 53 71 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  zSql);.#ifndef S
2ac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
2ad0: 5a 45 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ZE.    if( rc==S
2ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2af0: 20 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69    sqlite3Analysi
2b00: 73 4c 6f 61 64 28 64 62 2c 20 69 44 62 29 3b 0a  sLoad(db, iDb);.
2b10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2b20: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2b30: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
2b40: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2b50: 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
2b60: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
2b70: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
2b80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2b90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 64  =SQLITE_OK || (d
2ba0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2bb0: 4e 6f 53 63 68 65 6d 61 45 72 72 6f 72 29 29 7b  NoSchemaError)){
2bc0: 0a 20 20 20 20 2f 2a 20 42 6c 61 63 6b 20 6d 61  .    /* Black ma
2bd0: 67 69 63 3a 20 49 66 20 74 68 65 20 53 51 4c 49  gic: If the SQLI
2be0: 54 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f 72  TE_NoSchemaError
2bf0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2c00: 65 6e 20 63 6f 6e 73 69 64 65 72 0a 20 20 20 20  en consider.    
2c10: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f  ** the schema lo
2c20: 61 64 65 64 2c 20 65 76 65 6e 20 69 66 20 65 72  aded, even if er
2c30: 72 6f 72 73 20 6f 63 63 75 72 72 65 64 2e 20 49  rors occurred. I
2c40: 6e 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e  n this situation
2c50: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72   the .    ** cur
2c60: 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  rent sqlite3_pre
2c70: 70 61 72 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  pare() operation
2c80: 20 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74 20   will fail, but 
2c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  the following on
2ca0: 65 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 61 74  e.    ** will at
2cb0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 69 6c 65  tempt to compile
2cc0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 74   the supplied st
2cd0: 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20  atement against 
2ce0: 77 68 61 74 65 76 65 72 20 73 75 62 73 65 74 0a  whatever subset.
2cf0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
2d00: 68 65 6d 61 20 77 61 73 20 6c 6f 61 64 65 64 20  hema was loaded 
2d10: 62 65 66 6f 72 65 20 74 68 65 20 65 72 72 6f 72  before the error
2d20: 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 70   occurred. The p
2d30: 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 70 75  rimary.    ** pu
2d40: 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 69 73  rpose of this is
2d50: 20 74 6f 20 61 6c 6c 6f 77 20 61 63 63 65 73 73   to allow access
2d60: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   to the sqlite_m
2d70: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20  aster table.    
2d80: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 69 74 73  ** even when its
2d90: 20 63 6f 6e 74 65 6e 74 73 20 68 61 76 65 20 62   contents have b
2da0: 65 65 6e 20 63 6f 72 72 75 70 74 65 64 2e 0a 20  een corrupted.. 
2db0: 20 20 20 2a 2f 0a 20 20 20 20 44 62 53 65 74 50     */.    DbSetP
2dc0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
2dd0: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2de0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2df0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2e00: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 61   Jump here for a
2e10: 6e 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  n error that occ
2e20: 75 72 73 20 61 66 74 65 72 20 73 75 63 63 65 73  urs after succes
2e30: 73 66 75 6c 6c 79 20 61 6c 6c 6f 63 61 74 69 6e  sfully allocatin
2e40: 67 0a 20 20 2a 2a 20 63 75 72 4d 61 69 6e 20 61  g.  ** curMain a
2e50: 6e 64 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  nd calling sqlit
2e60: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 2e 20  e3BtreeEnter(). 
2e70: 46 6f 72 20 61 6e 20 65 72 72 6f 72 20 74 68 61  For an error tha
2e80: 74 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 62 65  t occurs.  ** be
2e90: 66 6f 72 65 20 74 68 61 74 20 70 6f 69 6e 74 2c  fore that point,
2ea0: 20 6a 75 6d 70 20 74 6f 20 65 72 72 6f 72 5f 6f   jump to error_o
2eb0: 75 74 2e 0a 20 20 2a 2f 0a 69 6e 69 74 6f 6e 65  ut..  */.initone
2ec0: 5f 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69 66  _error_out:.  if
2ed0: 28 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74  ( openedTransact
2ee0: 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ion ){.    sqlit
2ef0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 44  e3BtreeCommit(pD
2f00: 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73  b->pBt);.  }.  s
2f10: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f20: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 0a 65 72 72  (pDb->pBt);..err
2f30: 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  or_out:.  if( rc
2f40: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
2f50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2f60: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
2f70: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
2f80: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
2f90: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  db);.    }.    s
2fa0: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
2fb0: 68 65 6d 61 28 64 62 2c 20 69 44 62 29 3b 0a 20  hema(db, iDb);. 
2fc0: 20 7d 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75   }.  db->init.bu
2fd0: 73 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  sy = 0;.  return
2fe0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
2ff0: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 64 61 74  itialize all dat
3000: 61 62 61 73 65 20 66 69 6c 65 73 20 2d 20 74 68  abase files - th
3010: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
3020: 66 69 6c 65 2c 20 74 68 65 20 66 69 6c 65 0a 2a  file, the file.*
3030: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
3040: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3050: 2c 20 61 6e 64 20 61 6e 79 20 61 64 64 69 74 69  , and any additi
3060: 6f 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  onal database fi
3070: 6c 65 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 75  les.** created u
3080: 73 69 6e 67 20 41 54 54 41 43 48 20 73 74 61 74  sing ATTACH stat
3090: 65 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  ements.  Return 
30a0: 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 20  a success code. 
30b0: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
30c0: 6f 63 63 75 72 73 2c 20 77 72 69 74 65 20 61 6e  occurs, write an
30d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
30e0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
30f0: 2a 0a 2a 2a 20 41 66 74 65 72 20 61 20 64 61 74  *.** After a dat
3100: 61 62 61 73 65 20 69 73 20 69 6e 69 74 69 61 6c  abase is initial
3110: 69 7a 65 64 2c 20 74 68 65 20 44 42 5f 53 63 68  ized, the DB_Sch
3120: 65 6d 61 4c 6f 61 64 65 64 20 62 69 74 20 69 73  emaLoaded bit is
3130: 20 73 65 74 0a 2a 2a 20 62 69 74 20 69 73 20 73   set.** bit is s
3140: 65 74 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  et in the flags 
3150: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 44 62 20  field of the Db 
3160: 73 74 72 75 63 74 75 72 65 2e 20 49 66 20 74 68  structure. If th
3170: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
3180: 6c 65 20 77 61 73 20 6f 66 20 7a 65 72 6f 2d 6c  le was of zero-l
3190: 65 6e 67 74 68 2c 20 74 68 65 6e 20 74 68 65 20  ength, then the 
31a0: 44 42 5f 45 6d 70 74 79 20 66 6c 61 67 20 69 73  DB_Empty flag is
31b0: 20 61 6c 73 6f 20 73 65 74 2e 0a 2a 2f 0a 69 6e   also set..*/.in
31c0: 74 20 73 71 6c 69 74 65 33 49 6e 69 74 28 73 71  t sqlite3Init(sq
31d0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20  lite3 *db, char 
31e0: 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69  **pzErrMsg){.  i
31f0: 6e 74 20 69 2c 20 72 63 3b 0a 20 20 69 6e 74 20  nt i, rc;.  int 
3200: 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20  commit_internal 
3210: 3d 20 21 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  = !(db->mDbFlags
3220: 26 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  &DBFLAG_SchemaCh
3230: 61 6e 67 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  ange);.  .  asse
3240: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3250: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
3260: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
3270: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3280: 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 30 5d  Mutex(db->aDb[0]
3290: 2e 70 42 74 29 20 29 3b 0a 20 20 61 73 73 65 72  .pBt) );.  asser
32a0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
32b0: 3d 3d 30 20 29 3b 0a 20 20 45 4e 43 28 64 62 29  ==0 );.  ENC(db)
32c0: 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62   = SCHEMA_ENC(db
32d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
32e0: 3e 6e 44 62 3e 30 20 29 3b 0a 20 20 2f 2a 20 44  >nDb>0 );.  /* D
32f0: 6f 20 74 68 65 20 6d 61 69 6e 20 73 63 68 65 6d  o the main schem
3300: 61 20 66 69 72 73 74 20 2a 2f 0a 20 20 69 66 28  a first */.  if(
3310: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
3320: 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  db, 0, DB_Schema
3330: 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 72  Loaded) ){.    r
3340: 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 4f  c = sqlite3InitO
3350: 6e 65 28 64 62 2c 20 30 2c 20 70 7a 45 72 72 4d  ne(db, 0, pzErrM
3360: 73 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  sg, 0);.    if( 
3370: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
3380: 20 20 7d 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68    }.  /* All oth
3390: 65 72 20 73 63 68 65 6d 61 73 20 61 66 74 65 72  er schemas after
33a0: 20 74 68 65 20 6d 61 69 6e 20 73 63 68 65 6d 61   the main schema
33b0: 2e 20 54 68 65 20 22 74 65 6d 70 22 20 73 63 68  . The "temp" sch
33c0: 65 6d 61 20 6d 75 73 74 20 62 65 20 6c 61 73 74  ema must be last
33d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 64 62 2d 3e   */.  for(i=db->
33e0: 6e 44 62 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  nDb-1; i>0; i--)
33f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  {.    assert( i=
3400: 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =1 || sqlite3Btr
3410: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d  eeHoldsMutex(db-
3420: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 3b 0a  >aDb[i].pBt) );.
3430: 20 20 20 20 69 66 28 20 21 44 62 48 61 73 50 72      if( !DbHasPr
3440: 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42  operty(db, i, DB
3450: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
3460: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
3470: 69 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20  ite3InitOne(db, 
3480: 69 2c 20 70 7a 45 72 72 4d 73 67 2c 20 30 29 3b  i, pzErrMsg, 0);
3490: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
34a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
34b0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 6d 6d 69  .  }.  if( commi
34c0: 74 5f 69 6e 74 65 72 6e 61 6c 20 29 7b 0a 20 20  t_internal ){.  
34d0: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
34e0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
34f0: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
3500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3510: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3520: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
3530: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
3540: 65 6d 61 20 69 73 20 61 6c 72 65 61 64 79 20 69  ema is already i
3550: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 4f  nitialized..** O
3560: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 63  therwise, the sc
3570: 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 2e 20  hema is loaded. 
3580: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
3590: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
35a0: 74 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  t sqlite3ReadSch
35b0: 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
35c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
35d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
35e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
35f0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
3600: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3610: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
3620: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
3630: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 72 63 20  .busy ){.    rc 
3640: 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
3650: 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  , &pParse->zErrM
3660: 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sg);.    if( rc!
3670: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3680: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
3690: 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72 73   rc;.      pPars
36a0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
36b0: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e 6f 53  else if( db->noS
36c0: 68 61 72 65 64 43 61 63 68 65 20 29 7b 0a 20 20  haredCache ){.  
36d0: 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
36e0: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
36f0: 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 20 20 7d 0a  aKnownOk;.    }.
3700: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3710: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
3720: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
3730: 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
3740: 2e 20 20 49 66 20 61 6e 79 20 63 6f 6f 6b 69 65  .  If any cookie
3750: 20 69 73 20 6f 75 74 0a 2a 2a 20 6f 66 20 64 61   is out.** of da
3760: 74 65 20 73 65 74 20 70 50 61 72 73 65 2d 3e 72  te set pParse->r
3770: 63 20 74 6f 20 53 51 4c 49 54 45 5f 53 43 48 45  c to SQLITE_SCHE
3780: 4d 41 2e 20 20 49 66 20 61 6c 6c 20 73 63 68 65  MA.  If all sche
3790: 6d 61 20 63 6f 6f 6b 69 65 73 0a 2a 2a 20 6d 61  ma cookies.** ma
37a0: 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  ke no changes to
37b0: 20 70 50 61 72 73 65 2d 3e 72 63 2e 0a 2a 2f 0a   pParse->rc..*/.
37c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 63 68 65  static void sche
37d0: 6d 61 49 73 56 61 6c 69 64 28 50 61 72 73 65 20  maIsValid(Parse 
37e0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
37f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
3800: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
3810: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3820: 20 63 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73 73 65   cookie;..  asse
3830: 72 74 28 20 70 50 61 72 73 65 2d 3e 63 68 65 63  rt( pParse->chec
3840: 6b 53 63 68 65 6d 61 20 29 3b 0a 20 20 61 73 73  kSchema );.  ass
3850: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3860: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
3870: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 44 62 3d  x) );.  for(iDb=
3880: 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
3890: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iDb++){.    int 
38a0: 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f  openedTransactio
38b0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  n = 0;         /
38c0: 2a 20 54 72 75 65 20 69 66 20 61 20 74 72 61 6e  * True if a tran
38d0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
38e0: 64 20 2a 2f 0a 20 20 20 20 42 74 72 65 65 20 2a  d */.    Btree *
38f0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  pBt = db->aDb[iD
3900: 62 5d 2e 70 42 74 3b 20 20 20 20 20 2f 2a 20 42  b].pBt;     /* B
3910: 74 72 65 65 20 64 61 74 61 62 61 73 65 20 74 6f  tree database to
3920: 20 72 65 61 64 20 63 6f 6f 6b 69 65 20 66 72 6f   read cookie fro
3930: 6d 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74  m */.    if( pBt
3940: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
3950: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
3960: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
3970: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f 72 20  a read-only (or 
3980: 72 65 61 64 2d 77 72 69 74 65 29 20 74 72 61 6e  read-write) tran
3990: 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 0a 20  saction opened. 
39a0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62 2d 74     ** on the b-t
39b0: 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70  ree database, op
39c0: 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61  en one now. If a
39d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
39e0: 6f 70 65 6e 65 64 2c 20 69 74 20 0a 20 20 20 20  opened, it .    
39f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  ** will be close
3a00: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
3a10: 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
3a20: 6d 65 74 61 2d 76 61 6c 75 65 2e 20 2a 2f 0a 20  meta-value. */. 
3a30: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
3a40: 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
3a50: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
3a60: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
3a70: 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
3a80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
3aa0: 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  EM || rc==SQLITE
3ab0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
3ac0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
3ad0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
3ae0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
3af0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
3b00: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 6f 70 65  eturn;.      ope
3b10: 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  nedTransaction =
3b20: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
3b30: 2a 20 52 65 61 64 20 74 68 65 20 73 63 68 65 6d  * Read the schem
3b40: 61 20 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68  a cookie from th
3b50: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 69  e database. If i
3b60: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
3b70: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 76 61 6c   the .    ** val
3b80: 75 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ue stored as par
3b90: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
3ba0: 72 79 20 73 63 68 65 6d 61 20 72 65 70 72 65 73  ry schema repres
3bb0: 65 6e 74 61 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a  entation,.    **
3bc0: 20 73 65 74 20 50 61 72 73 65 2e 72 63 20 74 6f   set Parse.rc to
3bd0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20   SQLITE_SCHEMA. 
3be0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
3bf0: 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20  reeGetMeta(pBt, 
3c00: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
3c10: 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 63 6f  SION, (u32 *)&co
3c20: 6f 6b 69 65 29 3b 0a 20 20 20 20 61 73 73 65 72  okie);.    asser
3c30: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3c40: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3c50: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
3c60: 20 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e 61 44 62   cookie!=db->aDb
3c70: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
3c80: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
3c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
3ca0: 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20  etOneSchema(db, 
3cb0: 69 44 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72  iDb);.      pPar
3cc0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
3cd0: 53 43 48 45 4d 41 3b 0a 20 20 20 20 7d 0a 0a 20  SCHEMA;.    }.. 
3ce0: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20     /* Close the 
3cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
3d00: 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  one was opened. 
3d10: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 65 6e 65  */.    if( opene
3d20: 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  dTransaction ){.
3d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
3d40: 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
3d50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3d60: 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 68 65  * Convert a sche
3d70: 6d 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  ma pointer into 
3d80: 74 68 65 20 69 44 62 20 69 6e 64 65 78 20 74 68  the iDb index th
3d90: 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  at indicates.** 
3da0: 77 68 69 63 68 20 64 61 74 61 62 61 73 65 20 66  which database f
3db0: 69 6c 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ile in db->aDb[]
3dc0: 20 74 68 65 20 73 63 68 65 6d 61 20 72 65 66 65   the schema refe
3dd0: 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rs to..**.** If 
3de0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
3df0: 65 20 69 73 20 61 74 74 61 63 68 65 64 20 6d 6f  e is attached mo
3e00: 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68  re than once, th
3e10: 65 20 66 69 72 73 74 0a 2a 2a 20 61 74 74 61 63  e first.** attac
3e20: 68 65 64 20 64 61 74 61 62 61 73 65 20 69 73 20  hed database is 
3e30: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
3e50: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3e60: 62 2c 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  b, Schema *pSche
3e70: 6d 61 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  ma){.  int i = -
3e80: 31 30 30 30 30 30 30 3b 0a 0a 20 20 2f 2a 20 49  1000000;..  /* I
3e90: 66 20 70 53 63 68 65 6d 61 20 69 73 20 4e 55 4c  f pSchema is NUL
3ea0: 4c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 2d  L, then return -
3eb0: 31 30 30 30 30 30 30 2e 20 54 68 69 73 20 68 61  1000000. This ha
3ec0: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 65 20  ppens when code 
3ed0: 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e 63 20  in .  ** expr.c 
3ee0: 69 73 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73  is trying to res
3ef0: 6f 6c 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  olve a reference
3f00: 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
3f10: 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e 65 0a  table (i.e. one.
3f20: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
3f30: 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2e 20 49  a sub-select). I
3f40: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
3f50: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
3f60: 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74  this .  ** funct
3f70: 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ion should never
3f80: 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 0a 20   be used..  **. 
3f90: 20 2a 2a 20 57 65 20 72 65 74 75 72 6e 20 2d 31   ** We return -1
3fa0: 30 30 30 30 30 30 20 69 6e 73 74 65 61 64 20 6f  000000 instead o
3fb0: 66 20 74 68 65 20 6d 6f 72 65 20 75 73 75 61 6c  f the more usual
3fc0: 20 2d 31 20 73 69 6d 70 6c 79 20 62 65 63 61 75   -1 simply becau
3fd0: 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20 2d 31  se using.  ** -1
3fe0: 30 30 30 30 30 30 20 61 73 20 74 68 65 20 69 6e  000000 as the in
3ff0: 63 6f 72 72 65 63 74 20 69 6e 64 65 78 20 69 6e  correct index in
4000: 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69 73 20  to db->aDb[] is 
4010: 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72 65 20  much .  ** more 
4020: 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75 73 65 20  likely to cause 
4030: 61 20 73 65 67 66 61 75 6c 74 20 74 68 61 6e 20  a segfault than 
4040: 2d 31 20 28 6f 66 20 63 6f 75 72 73 65 20 74 68  -1 (of course th
4050: 65 72 65 20 61 72 65 20 61 73 73 65 72 74 28 29  ere are assert()
4060: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  .  ** statements
4070: 20 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e 65 76   too, but it nev
4080: 65 72 20 68 75 72 74 73 20 74 6f 20 70 6c 61 79  er hurts to play
4090: 20 74 68 65 20 6f 64 64 73 29 2e 0a 20 20 2a 2f   the odds)..  */
40a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
40b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
40c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
40d0: 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( pSchema ){.   
40e0: 20 66 6f 72 28 69 3d 30 3b 20 31 3b 20 69 2b 2b   for(i=0; 1; i++
40f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4100: 20 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20   i<db->nDb );.  
4110: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
4120: 69 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 53 63 68  i].pSchema==pSch
4130: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ema ){.        b
4140: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4150: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
4160: 69 3e 3d 30 20 26 26 20 69 3c 64 62 2d 3e 6e 44  i>=0 && i<db->nD
4170: 62 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  b );.  }.  retur
4180: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  n i;.}../*.** Fr
4190: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c  ee all memory al
41a0: 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 74 68 65  locations in the
41b0: 20 70 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a   pParse object.*
41c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
41d0: 72 73 65 72 52 65 73 65 74 28 50 61 72 73 65 20  rserReset(Parse 
41e0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
41f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4200: 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->db;.  sqlite3D
4210: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
4220: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
4230: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4240: 74 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  te(db, pParse->p
4250: 43 6f 6e 73 74 45 78 70 72 29 3b 0a 20 20 69 66  ConstExpr);.  if
4260: 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
4270: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
4280: 65 2e 62 44 69 73 61 62 6c 65 20 3e 3d 20 70 50  e.bDisable >= pP
4290: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f  arse->disableLoo
42a0: 6b 61 73 69 64 65 20 29 3b 0a 20 20 20 20 64 62  kaside );.    db
42b0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
42c0: 61 62 6c 65 20 2d 3d 20 70 50 61 72 73 65 2d 3e  able -= pParse->
42d0: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65  disableLookaside
42e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
42f0: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65  disableLookaside
4300: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
4310: 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46 2d 38  ompile the UTF-8
4320: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
4330: 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f  tement zSql into
4340: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
4350: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
4360: 6e 74 20 73 71 6c 69 74 65 33 50 72 65 70 61 72  nt sqlite3Prepar
4370: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
4380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4390: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
43a0: 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e. */.  const ch
43b0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
43c0: 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64    /* UTF-8 encod
43d0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
43e0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
43f0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
4400: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
4410: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
4420: 20 20 75 33 32 20 70 72 65 70 46 6c 61 67 73 2c    u32 prepFlags,
4430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a              /* Z
4440: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49  ero or more SQLI
4450: 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61  TE_PREPARE_* fla
4460: 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70 52  gs */.  Vdbe *pR
4470: 65 70 72 65 70 61 72 65 2c 20 20 20 20 20 20 20  eprepare,       
4480: 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65    /* VM being re
4490: 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20 73 71  prepared */.  sq
44a0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
44b0: 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20  tmt,    /* OUT: 
44c0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
44d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
44e0: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
44f0: 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20  har **pzTail    
4500: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f     /* OUT: End o
4510: 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20  f parsed string 
4520: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
4530: 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
4540: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
4550: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ge */.  int rc =
4560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4570: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
4580: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
45b0: 2a 2f 0a 20 20 50 61 72 73 65 20 73 50 61 72 73  */.  Parse sPars
45c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
45d0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
45e0: 74 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26  t */..  memset(&
45f0: 73 50 61 72 73 65 2c 20 30 2c 20 50 41 52 53 45  sParse, 0, PARSE
4600: 5f 48 44 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  _HDR_SZ);.  mems
4610: 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28 26 73  et(PARSE_TAIL(&s
4620: 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52 53 45  Parse), 0, PARSE
4630: 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 50 61  _TAIL_SZ);.  sPa
4640: 72 73 65 2e 70 52 65 70 72 65 70 61 72 65 20 3d  rse.pReprepare =
4650: 20 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 61   pReprepare;.  a
4660: 73 73 65 72 74 28 20 70 70 53 74 6d 74 20 26 26  ssert( ppStmt &&
4670: 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20   *ppStmt==0 );. 
4680: 20 2f 2a 20 61 73 73 65 72 74 28 20 21 64 62 2d   /* assert( !db-
4690: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
46a0: 20 2f 2f 20 6e 6f 74 20 74 72 75 65 20 77 69 74   // not true wit
46b0: 68 20 53 51 4c 49 54 45 5f 55 53 45 5f 41 4c 4c  h SQLITE_USE_ALL
46c0: 4f 43 41 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OCA */.  assert(
46d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
46e0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
46f0: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 6c 6f  ;..  /* For a lo
4700: 6e 67 2d 74 65 72 6d 20 75 73 65 20 70 72 65 70  ng-term use prep
4710: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
4720: 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 0a  void the use of.
4730: 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d    ** lookaside m
4740: 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  emory..  */.  if
4750: 28 20 70 72 65 70 46 6c 61 67 73 20 26 20 53 51  ( prepFlags & SQ
4760: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52  LITE_PREPARE_PER
4770: 53 49 53 54 45 4e 54 20 29 7b 0a 20 20 20 20 73  SISTENT ){.    s
4780: 50 61 72 73 65 2e 64 69 73 61 62 6c 65 4c 6f 6f  Parse.disableLoo
4790: 6b 61 73 69 64 65 2b 2b 3b 0a 20 20 20 20 64 62  kaside++;.    db
47a0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
47b0: 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  able++;.  }..  /
47c0: 2a 20 43 68 65 63 6b 20 74 6f 20 76 65 72 69 66  * Check to verif
47d0: 79 20 74 68 61 74 20 69 74 20 69 73 20 70 6f 73  y that it is pos
47e0: 73 69 62 6c 65 20 74 6f 20 67 65 74 20 61 20 72  sible to get a r
47f0: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 0a  ead lock on all.
4800: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
4810: 68 65 6d 61 73 2e 20 20 54 68 65 20 69 6e 61 62  hemas.  The inab
4820: 69 6c 69 74 79 20 74 6f 20 67 65 74 20 61 20 72  ility to get a r
4830: 65 61 64 20 6c 6f 63 6b 20 69 6e 64 69 63 61 74  ead lock indicat
4840: 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 73 6f 6d  es that.  ** som
4850: 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
4860: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
4870: 6f 6c 64 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  olding a write-l
4880: 6f 63 6b 2c 20 77 68 69 63 68 20 69 6e 0a 20 20  ock, which in.  
4890: 2a 2a 20 74 75 72 6e 20 6d 65 61 6e 73 20 74 68  ** turn means th
48a0: 61 74 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  at the other con
48b0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  nection has made
48c0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 68 61   uncommitted cha
48d0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nges.  ** to the
48e0: 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2a 0a 20 20   schema..  **.  
48f0: 2a 2a 20 57 65 72 65 20 77 65 20 74 6f 20 70 72  ** Were we to pr
4900: 6f 63 65 65 64 20 61 6e 64 20 70 72 65 70 61 72  oceed and prepar
4910: 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
4920: 61 67 61 69 6e 73 74 20 74 68 65 20 75 6e 63 6f  against the unco
4930: 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 73 63 68  mmitted.  ** sch
4940: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ema changes and 
4950: 69 66 20 74 68 6f 73 65 20 73 63 68 65 6d 61 20  if those schema 
4960: 63 68 61 6e 67 65 73 20 61 72 65 20 73 75 62 73  changes are subs
4970: 65 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65 64 0a  equently rolled.
4980: 20 20 2a 2a 20 62 61 63 6b 20 61 6e 64 20 64 69    ** back and di
4990: 66 66 65 72 65 6e 74 20 63 68 61 6e 67 65 73 20  fferent changes 
49a0: 61 72 65 20 6d 61 64 65 20 69 6e 20 74 68 65 69  are made in thei
49b0: 72 20 70 6c 61 63 65 2c 20 74 68 65 6e 20 77 68  r place, then wh
49c0: 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 65  en this.  ** pre
49d0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
49e0: 67 6f 65 73 20 74 6f 20 72 75 6e 20 74 68 65 20  goes to run the 
49f0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 6f  schema cookie wo
4a00: 75 6c 64 20 66 61 69 6c 20 74 6f 20 64 65 74 65  uld fail to dete
4a10: 63 74 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  ct.  ** the sche
4a20: 6d 61 20 63 68 61 6e 67 65 2e 20 20 44 69 73 61  ma change.  Disa
4a30: 73 74 65 72 20 77 6f 75 6c 64 20 66 6f 6c 6c 6f  ster would follo
4a40: 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  w..  **.  ** Thi
4a50: 73 20 74 68 72 65 61 64 20 69 73 20 63 75 72 72  s thread is curr
4a60: 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 6d 75  ently holding mu
4a70: 74 65 78 65 73 20 6f 6e 20 61 6c 6c 20 42 74 72  texes on all Btr
4a80: 65 65 73 20 28 62 65 63 61 75 73 65 0a 20 20 2a  ees (because.  *
4a90: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  * of the sqlite3
4aa0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20  BtreeEnterAll() 
4ab0: 69 6e 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e  in sqlite3LockAn
4ac0: 64 50 72 65 70 61 72 65 28 29 29 20 73 6f 20 69  dPrepare()) so i
4ad0: 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
4ae0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 6f 74 68  ssible for anoth
4af0: 65 72 20 74 68 72 65 61 64 20 74 6f 20 73 74 61  er thread to sta
4b00: 72 74 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  rt a new schema 
4b10: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 68 69 6c  change.  ** whil
4b20: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
4b30: 73 20 72 75 6e 6e 69 6e 67 2e 20 20 48 65 6e 63  s running.  Henc
4b40: 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  e, we do not nee
4b50: 64 20 74 6f 20 68 6f 6c 64 20 0a 20 20 2a 2a 20  d to hold .  ** 
4b60: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 73 63 68  locks on the sch
4b70: 65 6d 61 2c 20 77 65 20 6a 75 73 74 20 6e 65 65  ema, we just nee
4b80: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e  d to make sure n
4b90: 6f 62 6f 64 79 20 65 6c 73 65 20 69 73 20 0a 20  obody else is . 
4ba0: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 68 65 6d   ** holding them
4bb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
4bc0: 20 74 68 61 74 20 73 65 74 74 69 6e 67 20 52 45   that setting RE
4bd0: 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 6f  AD_UNCOMMITTED o
4be0: 76 65 72 72 69 64 65 73 20 6d 6f 73 74 20 6c 6f  verrides most lo
4bf0: 63 6b 20 64 65 74 65 63 74 69 6f 6e 2c 0a 20 20  ck detection,.  
4c00: 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 20 2a  ** but it does *
4c10: 6e 6f 74 2a 20 6f 76 65 72 72 69 64 65 20 73 63  not* override sc
4c20: 68 65 6d 61 20 6c 6f 63 6b 20 64 65 74 65 63 74  hema lock detect
4c30: 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 61 6c 6c  ion, so this all
4c40: 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 77 6f 72 6b   still.  ** work
4c50: 73 20 65 76 65 6e 20 69 66 20 52 45 41 44 5f 55  s even if READ_U
4c60: 4e 43 4f 4d 4d 49 54 54 45 44 20 69 73 20 73 65  NCOMMITTED is se
4c70: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
4c80: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4c90: 2b 29 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  +) {.    Btree *
4ca0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
4cb0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
4cc0: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
4cd0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4ce0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 29 20 29  oldsMutex(pBt) )
4cf0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
4d00: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c  ite3BtreeSchemaL
4d10: 6f 63 6b 65 64 28 70 42 74 29 3b 0a 20 20 20 20  ocked(pBt);.    
4d20: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
4d30: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4d40: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  zDb = db->aDb[i]
4d50: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
4d60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
4d70: 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 22  ithMsg(db, rc, "
4d80: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
4d90: 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20  is locked: %s", 
4da0: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 74 65  zDb);.        te
4db0: 73 74 63 61 73 65 28 20 64 62 2d 3e 66 6c 61 67  stcase( db->flag
4dc0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
4dd0: 6e 63 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 20  ncommit );.     
4de0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70     goto end_prep
4df0: 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  are;.      }.   
4e00: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
4e10: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
4e20: 64 62 29 3b 0a 0a 20 20 73 50 61 72 73 65 2e 64  db);..  sParse.d
4e30: 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 6e 42  b = db;.  if( nB
4e40: 79 74 65 73 3e 3d 30 20 26 26 20 28 6e 42 79 74  ytes>=0 && (nByt
4e50: 65 73 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 42  es==0 || zSql[nB
4e60: 79 74 65 73 2d 31 5d 21 3d 30 29 20 29 7b 0a 20  ytes-1]!=0) ){. 
4e70: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 43 6f 70     char *zSqlCop
4e80: 79 3b 0a 20 20 20 20 69 6e 74 20 6d 78 4c 65 6e  y;.    int mxLen
4e90: 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   = db->aLimit[SQ
4ea0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
4eb0: 45 4e 47 54 48 5d 3b 0a 20 20 20 20 74 65 73 74  ENGTH];.    test
4ec0: 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78  case( nBytes==mx
4ed0: 4c 65 6e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  Len );.    testc
4ee0: 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78 4c  ase( nBytes==mxL
4ef0: 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  en+1 );.    if( 
4f00: 6e 42 79 74 65 73 3e 6d 78 4c 65 6e 20 29 7b 0a  nBytes>mxLen ){.
4f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4f20: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
4f30: 4c 49 54 45 5f 54 4f 4f 42 49 47 2c 20 22 73 74  LITE_TOOBIG, "st
4f40: 61 74 65 6d 65 6e 74 20 74 6f 6f 20 6c 6f 6e 67  atement too long
4f50: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ");.      rc = s
4f60: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
4f70: 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 29  , SQLITE_TOOBIG)
4f80: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
4f90: 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20 7d 0a  _prepare;.    }.
4fa0: 20 20 20 20 7a 53 71 6c 43 6f 70 79 20 3d 20 73      zSqlCopy = s
4fb0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
4fc0: 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73  db, zSql, nBytes
4fd0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 43  );.    if( zSqlC
4fe0: 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  opy ){.      sql
4ff0: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 26 73  ite3RunParser(&s
5000: 50 61 72 73 65 2c 20 7a 53 71 6c 43 6f 70 79 2c  Parse, zSqlCopy,
5010: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
5020: 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 20 3d    sParse.zTail =
5030: 20 26 7a 53 71 6c 5b 73 50 61 72 73 65 2e 7a 54   &zSql[sParse.zT
5040: 61 69 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b 0a 20  ail-zSqlCopy];. 
5050: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5060: 65 65 28 64 62 2c 20 7a 53 71 6c 43 6f 70 79 29  ee(db, zSqlCopy)
5070: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5080: 20 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 20     sParse.zTail 
5090: 3d 20 26 7a 53 71 6c 5b 6e 42 79 74 65 73 5d 3b  = &zSql[nBytes];
50a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
50b0: 20 20 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61      sqlite3RunPa
50c0: 72 73 65 72 28 26 73 50 61 72 73 65 2c 20 7a 53  rser(&sParse, zS
50d0: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
50e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d   }.  assert( 0==
50f0: 73 50 61 72 73 65 2e 6e 51 75 65 72 79 4c 6f 6f  sParse.nQueryLoo
5100: 70 20 29 3b 0a 0a 20 20 69 66 28 20 73 50 61 72  p );..  if( sPar
5110: 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  se.rc==SQLITE_DO
5120: 4e 45 20 29 20 73 50 61 72 73 65 2e 72 63 20 3d  NE ) sParse.rc =
5130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
5140: 28 20 73 50 61 72 73 65 2e 63 68 65 63 6b 53 63  ( sParse.checkSc
5150: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 63 68 65  hema ){.    sche
5160: 6d 61 49 73 56 61 6c 69 64 28 26 73 50 61 72 73  maIsValid(&sPars
5170: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  e);.  }.  if( db
5180: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5190: 7b 0a 20 20 20 20 73 50 61 72 73 65 2e 72 63 20  {.    sParse.rc 
51a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
51b0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
51c0: 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 2a 70 7a  zTail ){.    *pz
51d0: 54 61 69 6c 20 3d 20 73 50 61 72 73 65 2e 7a 54  Tail = sParse.zT
51e0: 61 69 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ail;.  }.  rc = 
51f0: 73 50 61 72 73 65 2e 72 63 3b 0a 0a 23 69 66 6e  sParse.rc;..#ifn
5200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5210: 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 72 63  EXPLAIN.  if( rc
5220: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
5230: 50 61 72 73 65 2e 70 56 64 62 65 20 26 26 20 73  Parse.pVdbe && s
5240: 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 20 29 7b  Parse.explain ){
5250: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
5260: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
5270: 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  zColName[] = {. 
5280: 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
5290: 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
52a0: 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
52b0: 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 2c  "p5", "comment",
52c0: 0a 20 20 20 20 20 20 20 22 69 64 22 2c 20 22 70  .       "id", "p
52d0: 61 72 65 6e 74 22 2c 20 22 6e 6f 74 75 73 65 64  arent", "notused
52e0: 22 2c 20 22 64 65 74 61 69 6c 22 0a 20 20 20 20  ", "detail".    
52f0: 7d 3b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73  };.    int iFirs
5300: 74 2c 20 6d 78 3b 0a 20 20 20 20 69 66 28 20 73  t, mx;.    if( s
5310: 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 3d 3d 32  Parse.explain==2
5320: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5330: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
5340: 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20 34 29  sParse.pVdbe, 4)
5350: 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74 20 3d  ;.      iFirst =
5360: 20 38 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20 31   8;.      mx = 1
5370: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
5380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5390: 65 74 4e 75 6d 43 6f 6c 73 28 73 50 61 72 73 65  etNumCols(sParse
53a0: 2e 70 56 64 62 65 2c 20 38 29 3b 0a 20 20 20 20  .pVdbe, 8);.    
53b0: 20 20 69 46 69 72 73 74 20 3d 20 30 3b 0a 20 20    iFirst = 0;.  
53c0: 20 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20 20 20      mx = 8;.    
53d0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 46 69 72  }.    for(i=iFir
53e0: 73 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  st; i<mx; i++){.
53f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5400: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 73 50 61 72  eSetColName(sPar
5410: 73 65 2e 70 56 64 62 65 2c 20 69 2d 69 46 69 72  se.pVdbe, i-iFir
5420: 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45  st, COLNAME_NAME
5430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
5450: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c 49  ColName[i], SQLI
5460: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
5470: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
5480: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5490: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
54a0: 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 73 50  te3VdbeSetSql(sP
54b0: 61 72 73 65 2e 70 56 64 62 65 2c 20 7a 53 71 6c  arse.pVdbe, zSql
54c0: 2c 20 28 69 6e 74 29 28 73 50 61 72 73 65 2e 7a  , (int)(sParse.z
54d0: 54 61 69 6c 2d 7a 53 71 6c 29 2c 20 70 72 65 70  Tail-zSql), prep
54e0: 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  Flags);.  }.  if
54f0: 28 20 73 50 61 72 73 65 2e 70 56 64 62 65 20 26  ( sParse.pVdbe &
5500: 26 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  & (rc!=SQLITE_OK
5510: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
5520: 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  iled) ){.    sql
5530: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
5540: 28 73 50 61 72 73 65 2e 70 56 64 62 65 29 3b 0a  (sParse.pVdbe);.
5550: 20 20 20 20 61 73 73 65 72 74 28 21 28 2a 70 70      assert(!(*pp
5560: 53 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Stmt));.  }else{
5570: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  .    *ppStmt = (
5580: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 50  sqlite3_stmt*)sP
5590: 61 72 73 65 2e 70 56 64 62 65 3b 0a 20 20 7d 0a  arse.pVdbe;.  }.
55a0: 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
55b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
55c0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
55d0: 2c 20 22 25 73 22 2c 20 7a 45 72 72 4d 73 67 29  , "%s", zErrMsg)
55e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
55f0: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
5600: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5610: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5620: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  rc);.  }..  /* D
5630: 65 6c 65 74 65 20 61 6e 79 20 54 72 69 67 67 65  elete any Trigge
5640: 72 50 72 67 20 73 74 72 75 63 74 75 72 65 73 20  rPrg structures 
5650: 61 6c 6c 6f 63 61 74 65 64 20 77 68 69 6c 65 20  allocated while 
5660: 70 61 72 73 69 6e 67 20 74 68 69 73 20 73 74 61  parsing this sta
5670: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 77 68 69  tement. */.  whi
5680: 6c 65 28 20 73 50 61 72 73 65 2e 70 54 72 69 67  le( sParse.pTrig
5690: 67 65 72 50 72 67 20 29 7b 0a 20 20 20 20 54 72  gerPrg ){.    Tr
56a0: 69 67 67 65 72 50 72 67 20 2a 70 54 20 3d 20 73  iggerPrg *pT = s
56b0: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72  Parse.pTriggerPr
56c0: 67 3b 0a 20 20 20 20 73 50 61 72 73 65 2e 70 54  g;.    sParse.pT
56d0: 72 69 67 67 65 72 50 72 67 20 3d 20 70 54 2d 3e  riggerPrg = pT->
56e0: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
56f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 29  e3DbFree(db, pT)
5700: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 72 65 70 61  ;.  }..end_prepa
5710: 72 65 3a 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  re:..  sqlite3Pa
5720: 72 73 65 72 52 65 73 65 74 28 26 73 50 61 72 73  rserReset(&sPars
5730: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
5740: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  .}.static int sq
5750: 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70  lite3LockAndPrep
5760: 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
5770: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
5780: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
5790: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
57a0: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
57b0: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
57c0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
57d0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
57e0: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
57f0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
5800: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
5810: 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67  /.  u32 prepFlag
5820: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
5830: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
5840: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
5850: 6c 61 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  lags */.  Vdbe *
5860: 70 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  pOld,           
5870: 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
5880: 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20  reprepared */.  
5890: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
58a0: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
58b0: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
58c0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
58d0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
58e0: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
58f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
5900: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
5910: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
5920: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
5930: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5940: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
5950: 0a 20 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30  .  if( ppStmt==0
5960: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5970: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
5980: 6e 64 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ndif.  *ppStmt =
5990: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
59a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
59b0: 64 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a  db)||zSql==0 ){.
59c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
59d0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
59e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
59f0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
5a00: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
5a10: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
5a20: 0a 20 20 64 6f 7b 0a 20 20 20 20 2f 2a 20 4d 61  .  do{.    /* Ma
5a30: 6b 65 20 6d 75 6c 74 69 70 6c 65 20 61 74 74 65  ke multiple atte
5a40: 6d 70 74 73 20 74 6f 20 63 6f 6d 70 69 6c 65 20  mpts to compile 
5a50: 74 68 65 20 53 51 4c 2c 20 75 6e 74 69 6c 20 69  the SQL, until i
5a60: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
5a70: 73 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6e 63 6f  s.    ** or enco
5a80: 75 6e 74 65 72 73 20 61 20 70 65 72 6d 61 6e 65  unters a permane
5a90: 6e 74 20 65 72 72 6f 72 2e 20 20 41 20 73 63 68  nt error.  A sch
5aa0: 65 6d 61 20 70 72 6f 62 6c 65 6d 20 61 66 74 65  ema problem afte
5ab0: 72 20 6f 6e 65 20 73 63 68 65 6d 61 0a 20 20 20  r one schema.   
5ac0: 20 2a 2a 20 72 65 73 65 74 20 69 73 20 63 6f 6e   ** reset is con
5ad0: 73 69 64 65 72 65 64 20 61 20 70 65 72 6d 61 6e  sidered a perman
5ae0: 65 6e 74 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20  ent error. */.  
5af0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72    rc = sqlite3Pr
5b00: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
5b10: 6e 42 79 74 65 73 2c 20 70 72 65 70 46 6c 61 67  nBytes, prepFlag
5b20: 73 2c 20 70 4f 6c 64 2c 20 70 70 53 74 6d 74 2c  s, pOld, ppStmt,
5b30: 20 70 7a 54 61 69 6c 29 3b 0a 20 20 20 20 61 73   pzTail);.    as
5b40: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
5b50: 5f 4f 4b 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d  _OK || *ppStmt==
5b60: 30 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  0 );.  }while( r
5b70: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  c==SQLITE_ERROR_
5b80: 52 45 54 52 59 0a 20 20 20 20 20 20 20 7c 7c 20  RETRY.       || 
5b90: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45  (rc==SQLITE_SCHE
5ba0: 4d 41 20 26 26 20 28 73 71 6c 69 74 65 33 52 65  MA && (sqlite3Re
5bb0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c  setOneSchema(db,
5bc0: 2d 31 29 2c 20 63 6e 74 2b 2b 29 3d 3d 30 29 20  -1), cnt++)==0) 
5bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
5be0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
5bf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
5c00: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
5c10: 61 73 73 65 72 74 28 20 28 72 63 26 64 62 2d 3e  assert( (rc&db->
5c20: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
5c30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5c40: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
5c50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5c60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5c70: 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
5c80: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
5c90: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
5ca0: 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 62 75 66  final output buf
5cb0: 66 65 72 20 73 69 7a 65 20 6e 65 65 64 65 64 20  fer size needed 
5cc0: 66 6f 72 20 74 68 65 20 66 75 6c 6c 79 0a 2a 2a  for the fully.**
5cd0: 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 76 65 72 73   normalized vers
5ce0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
5cf0: 66 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 2e  fied SQL string.
5d00: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 74 61    This should ta
5d10: 6b 65 20 69 6e 74 6f 0a 2a 2a 20 61 63 63 6f 75  ke into.** accou
5d20: 6e 74 20 61 6e 79 20 70 6f 74 65 6e 74 69 61 6c  nt any potential
5d30: 20 65 78 70 61 6e 73 69 6f 6e 20 74 68 61 74 20   expansion that 
5d40: 63 6f 75 6c 64 20 6f 63 63 75 72 20 28 65 2e 67  could occur (e.g
5d50: 2e 20 76 69 61 20 49 4e 20 63 6c 61 75 73 65 73  . via IN clauses
5d60: 0a 2a 2a 20 62 65 69 6e 67 20 65 78 70 61 6e 64  .** being expand
5d70: 65 64 2c 20 65 74 63 29 2e 20 20 54 68 69 73 20  ed, etc).  This 
5d80: 73 69 7a 65 20 72 65 74 75 72 6e 65 64 20 69 73  size returned is
5d90: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
5da0: 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 69 6e  r of bytes.** in
5db0: 63 6c 75 64 69 6e 67 20 74 68 65 20 4e 55 4c 20  cluding the NUL 
5dc0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73  terminator..*/.s
5dd0: 74 61 74 69 63 20 69 6e 74 20 65 73 74 69 6d 61  tatic int estima
5de0: 74 65 4e 6f 72 6d 61 6c 69 7a 65 64 53 69 7a 65  teNormalizedSize
5df0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
5e00: 7a 53 71 6c 2c 20 2f 2a 20 54 68 65 20 6f 72 69  zSql, /* The ori
5e10: 67 69 6e 61 6c 20 53 51 4c 20 73 74 72 69 6e 67  ginal SQL string
5e20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20 20   */.  int nSql  
5e30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
5e40: 68 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 53 51  h of original SQ
5e50: 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  L string */.){. 
5e60: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 6e 53 71 6c   int nOut = nSql
5e70: 20 2b 20 34 3b 0a 20 20 63 6f 6e 73 74 20 63 68   + 4;.  const ch
5e80: 61 72 20 2a 7a 20 3d 20 7a 53 71 6c 3b 0a 20 20  ar *z = zSql;.  
5e90: 77 68 69 6c 65 28 20 6e 4f 75 74 3c 6e 53 71 6c  while( nOut<nSql
5ea0: 2a 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  *5 ){.    while(
5eb0: 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a 5b 30 5d   z[0]!=0 && z[0]
5ec0: 21 3d 27 49 27 20 26 26 20 7a 5b 30 5d 21 3d 27  !='I' && z[0]!='
5ed0: 69 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  i' ){ z++; }.   
5ee0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 62   if( z[0]==0 ) b
5ef0: 72 65 61 6b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  reak;.    z++;. 
5f00: 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 4e 27     if( z[0]!='N'
5f10: 20 26 26 20 7a 5b 30 5d 21 3d 27 6e 27 20 29 20   && z[0]!='n' ) 
5f20: 62 72 65 61 6b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a  break;.    z++;.
5f30: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
5f40: 65 33 49 73 73 70 61 63 65 28 7a 5b 30 5d 29 20  e3Isspace(z[0]) 
5f50: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
5f60: 28 20 7a 5b 30 5d 21 3d 27 28 27 20 29 20 62 72  ( z[0]!='(' ) br
5f70: 65 61 6b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  eak;.    z++;.  
5f80: 20 20 6e 4f 75 74 20 2b 3d 20 35 3b 20 2f 2a 20    nOut += 5; /* 
5f90: 3f 2c 3f 2c 3f 20 2a 2f 0a 20 20 7d 0a 20 20 72  ?,?,? */.  }.  r
5fa0: 65 74 75 72 6e 20 6e 4f 75 74 3b 0a 7d 0a 0a 2f  eturn nOut;.}../
5fb0: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 75  *.** Copy the cu
5fc0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 69 6e 74 6f  rrent token into
5fd0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
5fe0: 65 72 20 77 68 69 6c 65 20 64 65 61 6c 69 6e 67  er while dealing
5ff0: 20 77 69 74 68 20 71 75 6f 74 65 64 0a 2a 2a 20   with quoted.** 
6000: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 42 79  identifiers.  By
6010: 20 64 65 66 61 75 6c 74 2c 20 61 6c 6c 20 6c 65   default, all le
6020: 74 74 65 72 73 20 77 69 6c 6c 20 62 65 20 63 6f  tters will be co
6030: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 6c 6f 77  nverted into low
6040: 65 72 63 61 73 65 2e 0a 2a 2a 20 49 66 20 74 68  ercase..** If th
6050: 65 20 62 55 70 70 65 72 20 66 6c 61 67 20 69 73  e bUpper flag is
6060: 20 73 65 74 2c 20 75 70 70 65 72 63 61 73 65 20   set, uppercase 
6070: 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54  will be used.  T
6080: 68 65 20 70 69 4f 75 74 20 61 72 67 75 6d 65 6e  he piOut argumen
6090: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65  t.** will be use
60a0: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
60b0: 74 61 72 67 65 74 20 69 6e 64 65 78 20 69 6e 74  target index int
60c0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 74 72  o the output str
60d0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
60e0: 6f 69 64 20 63 6f 70 79 4e 6f 72 6d 61 6c 69 7a  oid copyNormaliz
60f0: 65 64 54 6f 6b 65 6e 28 0a 20 20 63 6f 6e 73 74  edToken(.  const
6100: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a 20   char *zSql, /* 
6110: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  The original SQL
6120: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
6130: 20 69 49 6e 2c 20 20 20 20 20 20 20 20 20 20 2f   iIn,          /
6140: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
6150: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
6160: 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  l SQL string */.
6170: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
6180: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6190: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 75   bytes in the cu
61a0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
61b0: 20 69 6e 74 20 74 6f 6b 65 6e 46 6c 61 67 73 2c   int tokenFlags,
61c0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 72 65 74 75     /* Flags retu
61d0: 72 6e 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65  rned by the toke
61e0: 6e 69 7a 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  nizer */.  char 
61f0: 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20 2f 2a 20  *zOut,       /* 
6200: 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e  The output strin
6210: 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 4f 75  g */.  int *piOu
6220: 74 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  t        /* Poin
6230: 74 65 72 20 74 6f 20 74 61 72 67 65 74 20 69 6e  ter to target in
6240: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  dex into the out
6250: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  put string */.){
6260: 0a 20 20 69 6e 74 20 62 51 75 6f 74 65 64 20 3d  .  int bQuoted =
6270: 20 74 6f 6b 65 6e 46 6c 61 67 73 20 26 20 53 51   tokenFlags & SQ
6280: 4c 49 54 45 5f 54 4f 4b 45 4e 5f 51 55 4f 54 45  LITE_TOKEN_QUOTE
6290: 44 3b 0a 20 20 69 6e 74 20 62 4b 65 79 77 6f 72  D;.  int bKeywor
62a0: 64 20 3d 20 74 6f 6b 65 6e 46 6c 61 67 73 20 26  d = tokenFlags &
62b0: 20 53 51 4c 49 54 45 5f 54 4f 4b 45 4e 5f 4b 45   SQLITE_TOKEN_KE
62c0: 59 57 4f 52 44 3b 0a 20 20 69 6e 74 20 6a 20 3d  YWORD;.  int j =
62d0: 20 2a 70 69 4f 75 74 2c 20 6b 20 3d 20 30 3b 0a   *piOut, k = 0;.
62e0: 20 20 66 6f 72 28 3b 20 6b 3c 6e 54 6f 6b 65 6e    for(; k<nToken
62f0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; k++){.    if( 
6300: 62 51 75 6f 74 65 64 20 29 7b 0a 20 20 20 20 20  bQuoted ){.     
6310: 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 69 49 6e   if( k==0 && iIn
6320: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4f  >0 ){.        zO
6330: 75 74 5b 6a 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20  ut[j++] = '"';. 
6340: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6350: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6360: 20 6b 3d 3d 6e 54 6f 6b 65 6e 2d 31 20 29 7b 0a   k==nToken-1 ){.
6370: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
6380: 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ] = '"';.       
6390: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
63a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
63b0: 20 62 4b 65 79 77 6f 72 64 20 29 7b 0a 20 20 20   bKeyword ){.   
63c0: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 73     zOut[j++] = s
63d0: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 53  qlite3Toupper(zS
63e0: 71 6c 5b 69 49 6e 2b 6b 5d 29 3b 0a 20 20 20 20  ql[iIn+k]);.    
63f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4f 75  }else{.      zOu
6400: 74 5b 6a 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  t[j++] = sqlite3
6410: 54 6f 6c 6f 77 65 72 28 7a 53 71 6c 5b 69 49 6e  Tolower(zSql[iIn
6420: 2b 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  +k]);.    }.  }.
6430: 20 20 2a 70 69 4f 75 74 20 3d 20 6a 3b 0a 7d 0a    *piOut = j;.}.
6440: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6450: 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 6f   normalization o
6460: 66 20 74 68 65 20 53 51 4c 20 67 69 76 65 6e 20  f the SQL given 
6470: 62 79 20 7a 53 71 6c 5b 30 2e 2e 6e 53 71 6c 2d  by zSql[0..nSql-
6480: 31 5d 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  1].  Return.** t
6490: 68 65 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e  he normalization
64a0: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
64b0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
64c0: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 4f 72 20 72  bMalloc().  Or r
64d0: 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66  eturn.** NULL if
64e0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
64f0: 72 6f 6e 67 20 6f 72 20 69 66 20 7a 53 71 6c 20  rong or if zSql 
6500: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 68 61 72  is NULL..*/.char
6510: 20 2a 73 71 6c 69 74 65 33 4e 6f 72 6d 61 6c 69   *sqlite3Normali
6520: 7a 65 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62  ze(.  Vdbe *pVdb
6530: 65 2c 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e,      /* VM be
6540: 69 6e 67 20 72 65 70 72 65 70 61 72 65 64 20 2a  ing reprepared *
6550: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6560: 7a 53 71 6c 2c 20 2f 2a 20 54 68 65 20 6f 72 69  zSql, /* The ori
6570: 67 69 6e 61 6c 20 53 51 4c 20 73 74 72 69 6e 67  ginal SQL string
6580: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20 20   */.  int nSql  
6590: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
65a0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  of the input str
65b0: 69 6e 67 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ing in bytes */.
65c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
65d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
65e0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
65f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
6600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6610: 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  he output string
6620: 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 3b 20 20 20   */.  int nZ;   
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6640: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  Size of the outp
6650: 75 74 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74  ut string in byt
6660: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6680: 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72  * Next character
6690: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 7a 53   to read from zS
66a0: 71 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ql[] */.  int j;
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
66d0: 65 72 20 74 6f 20 66 69 6c 6c 20 69 6e 20 6f 6e  er to fill in on
66e0: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 74 6f   z[] */.  int to
66f0: 6b 65 6e 54 79 70 65 20 3d 20 30 3b 20 20 20 20  kenType = 0;    
6700: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
6710: 6e 65 78 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  next token */.  
6720: 69 6e 74 20 70 72 65 76 54 6f 6b 65 6e 54 79 70  int prevTokenTyp
6730: 65 20 3d 20 30 3b 20 2f 2a 20 54 79 70 65 20 6f  e = 0; /* Type o
6740: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  f the previous t
6750: 6f 6b 65 6e 2c 20 65 78 63 65 70 74 20 73 70 61  oken, except spa
6760: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ces */.  int n; 
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6e  /* Size of the n
6790: 65 78 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ext token */.  i
67a0: 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 20 20  nt nParen = 0;  
67b0: 20 20 20 20 20 20 2f 2a 20 4e 65 73 74 69 6e 67        /* Nesting
67c0: 20 6c 65 76 65 6c 20 6f 66 20 70 61 72 65 6e 74   level of parent
67d0: 68 65 73 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69  hesis */.  int i
67e0: 53 74 61 72 74 49 4e 20 3d 20 30 3b 20 20 20 20  StartIN = 0;    
67f0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 52 48    /* Start of RH
6800: 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
6810: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
6820: 20 6e 50 61 72 65 6e 41 74 49 4e 20 3d 20 30 3b   nParenAtIN = 0;
6830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
6840: 6e 50 61 72 65 6e 74 20 61 74 20 73 74 61 72 74  nParent at start
6850: 20 6f 66 20 52 48 53 20 6f 66 20 49 4e 20 6f 70   of RHS of IN op
6860: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 64 62 20  erator */..  db 
6870: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  = sqlite3VdbeDb(
6880: 70 56 64 62 65 29 3b 0a 20 20 61 73 73 65 72 74  pVdbe);.  assert
6890: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
68a0: 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
68b0: 6e 20 30 3b 0a 20 20 6e 5a 20 3d 20 65 73 74 69  n 0;.  nZ = esti
68c0: 6d 61 74 65 4e 6f 72 6d 61 6c 69 7a 65 64 53 69  mateNormalizedSi
68d0: 7a 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 3b 0a  ze(zSql, nSql);.
68e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    z = sqlite3DbM
68f0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
6900: 5a 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  Z);.  if( z==0 )
6910: 20 67 6f 74 6f 20 6e 6f 72 6d 61 6c 69 7a 65 45   goto normalizeE
6920: 72 72 6f 72 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  rror;.  for(i=j=
6930: 30 3b 20 69 3c 6e 53 71 6c 20 26 26 20 7a 53 71  0; i<nSql && zSq
6940: 6c 5b 69 5d 3b 20 69 2b 3d 6e 29 7b 0a 20 20 20  l[i]; i+=n){.   
6950: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a   int flags = 0;.
6960: 20 20 20 20 69 66 28 20 74 6f 6b 65 6e 54 79 70      if( tokenTyp
6970: 65 21 3d 54 4b 5f 53 50 41 43 45 20 29 20 70 72  e!=TK_SPACE ) pr
6980: 65 76 54 6f 6b 65 6e 54 79 70 65 20 3d 20 74 6f  evTokenType = to
6990: 6b 65 6e 54 79 70 65 3b 0a 20 20 20 20 6e 20 3d  kenType;.    n =
69a0: 20 73 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e   sqlite3GetToken
69b0: 4e 6f 72 6d 61 6c 69 7a 65 64 28 28 75 6e 73 69  Normalized((unsi
69c0: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 71 6c 2b  gned char*)zSql+
69d0: 69 2c 20 26 74 6f 6b 65 6e 54 79 70 65 2c 20 26  i, &tokenType, &
69e0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 73 77 69 74  flags);.    swit
69f0: 63 68 28 20 74 6f 6b 65 6e 54 79 70 65 20 29 7b  ch( tokenType ){
6a00: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53  .      case TK_S
6a10: 50 41 43 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  PACE: {.        
6a20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6a30: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4c 4c       case TK_ILL
6a40: 45 47 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGAL: {.        
6a50: 67 6f 74 6f 20 6e 6f 72 6d 61 6c 69 7a 65 45 72  goto normalizeEr
6a60: 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
6a70: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
6a80: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  G:.      case TK
6a90: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
6aa0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
6ab0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52       case TK_VAR
6ac0: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 63 61 73  IABLE:.      cas
6ad0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
6ae0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f       z[j++] = '?
6af0: 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ';.        break
6b00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6b10: 63 61 73 65 20 54 4b 5f 4c 50 3a 0a 20 20 20 20  case TK_LP:.    
6b20: 20 20 63 61 73 65 20 54 4b 5f 52 50 3a 20 7b 0a    case TK_RP: {.
6b30: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 6b 65          if( toke
6b40: 6e 54 79 70 65 3d 3d 54 4b 5f 4c 50 20 29 7b 0a  nType==TK_LP ){.
6b50: 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
6b60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
6b70: 28 20 70 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d  ( prevTokenType=
6b80: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20  =TK_IN ){.      
6b90: 20 20 20 20 20 20 69 53 74 61 72 74 49 4e 20 3d        iStartIN =
6ba0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
6bb0: 6e 50 61 72 65 6e 41 74 49 4e 20 3d 20 6e 50 61  nParenAtIN = nPa
6bc0: 72 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ren;.          }
6bd0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6be0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
6bf0: 74 61 72 74 49 4e 3e 30 20 26 26 20 6e 50 61 72  tartIN>0 && nPar
6c00: 65 6e 3d 3d 6e 50 61 72 65 6e 41 74 49 4e 20 29  en==nParenAtIN )
6c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
6c20: 73 65 72 74 28 20 69 53 74 61 72 74 49 4e 2b 36  sert( iStartIN+6
6c30: 3c 6e 5a 20 29 3b 0a 20 20 20 20 20 20 20 20 20  <nZ );.         
6c40: 20 20 20 6d 65 6d 63 70 79 28 7a 2b 69 53 74 61     memcpy(z+iSta
6c50: 72 74 49 4e 2b 31 2c 20 22 3f 2c 3f 2c 3f 22 2c  rtIN+1, "?,?,?",
6c60: 20 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   5);.           
6c70: 20 6a 20 3d 20 69 53 74 61 72 74 49 4e 2b 36 3b   j = iStartIN+6;
6c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
6c90: 65 72 74 28 20 6e 5a 2d 31 2d 6a 3e 3d 30 20 29  ert( nZ-1-j>=0 )
6ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
6cb0: 73 65 72 74 28 20 6e 5a 2d 31 2d 6a 3c 6e 5a 20  sert( nZ-1-j<nZ 
6cc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  );.            m
6cd0: 65 6d 73 65 74 28 7a 2b 6a 2c 20 30 2c 20 6e 5a  emset(z+j, 0, nZ
6ce0: 2d 31 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  -1-j);.         
6cf0: 20 20 20 69 53 74 61 72 74 49 4e 20 3d 20 30 3b     iStartIN = 0;
6d00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6d10: 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b         nParen--;
6d20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6d30: 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 72 65     assert( nPare
6d40: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n>=0 );.        
6d50: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
6d60: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
6d70: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
6d80: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45        case TK_SE
6d90: 4d 49 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  MI:.      case T
6da0: 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 20 20 63 61  K_PLUS:.      ca
6db0: 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
6dc0: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
6dd0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 52  .      case TK_R
6de0: 45 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  EM:.      case T
6df0: 4b 5f 45 51 3a 0a 20 20 20 20 20 20 63 61 73 65  K_EQ:.      case
6e00: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 20 20 63 61   TK_LE:.      ca
6e10: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 20 20  se TK_NE:.      
6e20: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
6e30: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54        case TK_LT
6e40: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
6e50: 52 53 48 49 46 54 3a 0a 20 20 20 20 20 20 63 61  RSHIFT:.      ca
6e60: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 20 20  se TK_GT:.      
6e70: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
6e80: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
6e90: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 43  .      case TK_C
6ea0: 4f 4e 43 41 54 3a 0a 20 20 20 20 20 20 63 61 73  ONCAT:.      cas
6eb0: 65 20 54 4b 5f 43 4f 4d 4d 41 3a 0a 20 20 20 20  e TK_COMMA:.    
6ec0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
6ed0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
6ee0: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 20 20 63 61  BITNOT:.      ca
6ef0: 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 20  se TK_DOT:.     
6f00: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
6f10: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
6f20: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54       case TK_NOT
6f30: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
6f40: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  NULL:.      case
6f50: 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   TK_ID: {.      
6f60: 20 20 69 66 28 20 74 6f 6b 65 6e 54 79 70 65 3d    if( tokenType=
6f70: 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  =TK_NULL ){.    
6f80: 20 20 20 20 20 20 69 66 28 20 70 72 65 76 54 6f        if( prevTo
6f90: 6b 65 6e 54 79 70 65 3d 3d 54 4b 5f 49 53 20 7c  kenType==TK_IS |
6fa0: 7c 20 70 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d  | prevTokenType=
6fb0: 3d 54 4b 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_NOT ){.     
6fc0: 20 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 69         /* NULL i
6fd0: 73 20 61 20 6b 65 79 77 6f 72 64 20 69 6e 20 74  s a keyword in t
6fe0: 68 69 73 20 63 61 73 65 2c 20 6e 6f 74 20 61 20  his case, not a 
6ff0: 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20 2a 2f  literal value */
7000: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7010: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
7020: 20 48 65 72 65 20 74 68 65 20 4e 55 4c 4c 20 69   Here the NULL i
7030: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
7040: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
7050: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20   z[j++] = '?';. 
7060: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7070: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7090: 69 66 28 20 6a 3e 30 20 26 26 20 73 71 6c 69 74  if( j>0 && sqlit
70a0: 65 33 49 73 49 64 43 68 61 72 28 7a 5b 6a 2d 31  e3IsIdChar(z[j-1
70b0: 5d 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 49  ]) && sqlite3IsI
70c0: 64 43 68 61 72 28 7a 53 71 6c 5b 69 5d 29 20 29  dChar(zSql[i]) )
70d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
70e0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
70f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7100: 74 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b 5f 49 44  tokenType==TK_ID
7110: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7120: 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 22 27 0a 20  ( zSql[i]=='"'. 
7130: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
7140: 69 74 65 33 56 64 62 65 55 73 65 73 44 6f 75 62  ite3VdbeUsesDoub
7150: 6c 65 51 75 6f 74 65 64 53 74 72 69 6e 67 28 64  leQuotedString(d
7160: 62 2c 70 56 64 62 65 2c 7a 53 71 6c 2b 69 2c 6e  b,pVdbe,zSql+i,n
7170: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
7180: 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b             z[j++
7190: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 20  ] = '?';.       
71a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
71b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71c0: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 6e 50    if( nParen==nP
71d0: 61 72 65 6e 41 74 49 4e 20 29 20 69 53 74 61 72  arenAtIN ) iStar
71e0: 74 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tIN = 0;.       
71f0: 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 70 79 4e   }.        copyN
7200: 6f 72 6d 61 6c 69 7a 65 64 54 6f 6b 65 6e 28 7a  ormalizedToken(z
7210: 53 71 6c 2c 20 69 2c 20 6e 2c 20 66 6c 61 67 73  Sql, i, n, flags
7220: 2c 20 7a 2c 20 26 6a 29 3b 0a 20 20 20 20 20 20  , z, &j);.      
7230: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
7250: 65 72 74 28 20 6a 3c 6e 5a 20 26 26 20 22 6f 6e  ert( j<nZ && "on
7260: 65 22 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6a  e" );.  while( j
7270: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 3d 3d 27 20  >0 && z[j-1]==' 
7280: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 69 66  ' ){ j--; }.  if
7290: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
72a0: 3d 27 3b 27 20 29 7b 20 7a 5b 6a 2b 2b 5d 20 3d  =';' ){ z[j++] =
72b0: 20 27 3b 27 3b 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   ';'; }.  z[j] =
72c0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   0;.  assert( j<
72d0: 6e 5a 20 26 26 20 22 74 77 6f 22 20 29 3b 0a 20  nZ && "two" );. 
72e0: 20 72 65 74 75 72 6e 20 7a 3b 0a 0a 6e 6f 72 6d   return z;..norm
72f0: 61 6c 69 7a 65 45 72 72 6f 72 3a 0a 20 20 73 71  alizeError:.  sq
7300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7310: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  z);.  return 0;.
7320: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7330: 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c  TE_ENABLE_NORMAL
7340: 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE */../*.** Re
7350: 72 75 6e 20 74 68 65 20 63 6f 6d 70 69 6c 61 74  run the compilat
7360: 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 65 6d 65  ion of a stateme
7370: 6e 74 20 61 66 74 65 72 20 61 20 73 63 68 65 6d  nt after a schem
7380: 61 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20  a change..**.** 
7390: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
73a0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
73b0: 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20 72 65 74   recompiled, ret
73c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
73d0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20  therwise,.** if 
73e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61  the statement ca
73f0: 6e 6e 6f 74 20 62 65 20 72 65 63 6f 6d 70 69 6c  nnot be recompil
7400: 65 64 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  ed because anoth
7410: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
7420: 73 0a 2a 2a 20 6c 6f 63 6b 65 64 20 74 68 65 20  s.** locked the 
7430: 73 71 6c 69 74 65 33 5f 6d 61 73 74 65 72 20 74  sqlite3_master t
7440: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  able, return SQL
7450: 49 54 45 5f 4c 4f 43 4b 45 44 2e 20 49 66 20 61  ITE_LOCKED. If a
7460: 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ny other error.*
7470: 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
7480: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a   SQLITE_SCHEMA..
7490: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65  */.int sqlite3Re
74a0: 70 72 65 70 61 72 65 28 56 64 62 65 20 2a 70 29  prepare(Vdbe *p)
74b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
74c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 77  lite3_stmt *pNew
74d0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
74e0: 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  zSql;.  sqlite3 
74f0: 2a 64 62 3b 0a 20 20 75 38 20 70 72 65 70 46 6c  *db;.  u8 prepFl
7500: 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ags;..  assert( 
7510: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7520: 6c 64 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ld(sqlite3VdbeDb
7530: 28 70 29 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (p)->mutex) );. 
7540: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
7550: 73 71 6c 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  sql((sqlite3_stm
7560: 74 20 2a 29 70 29 3b 0a 20 20 61 73 73 65 72 74  t *)p);.  assert
7570: 28 20 7a 53 71 6c 21 3d 30 20 29 3b 20 20 2f 2a  ( zSql!=0 );  /*
7580: 20 52 65 70 72 65 70 61 72 65 20 6f 6e 6c 79 20   Reprepare only 
7590: 63 61 6c 6c 65 64 20 66 6f 72 20 70 72 65 70 61  called for prepa
75a0: 72 65 5f 76 32 28 29 20 73 74 61 74 65 6d 65 6e  re_v2() statemen
75b0: 74 73 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  ts */.  db = sql
75c0: 69 74 65 33 56 64 62 65 44 62 28 70 29 3b 0a 20  ite3VdbeDb(p);. 
75d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
75e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
75f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 72 65 70  mutex) );.  prep
7600: 46 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 56  Flags = sqlite3V
7610: 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
7620: 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
7630: 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65  e3LockAndPrepare
7640: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
7650: 72 65 70 46 6c 61 67 73 2c 20 70 2c 20 26 70 4e  repFlags, p, &pN
7660: 65 77 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ew, 0);.  if( rc
7670: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
7680: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
7690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
76a0: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
76b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
76c0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  w==0 );.    retu
76d0: 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rn rc;.  }else{.
76e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
76f0: 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  !=0 );.  }.  sql
7700: 69 74 65 33 56 64 62 65 53 77 61 70 28 28 56 64  ite3VdbeSwap((Vd
7710: 62 65 2a 29 70 4e 65 77 2c 20 70 29 3b 0a 20 20  be*)pNew, p);.  
7720: 73 71 6c 69 74 65 33 54 72 61 6e 73 66 65 72 42  sqlite3TransferB
7730: 69 6e 64 69 6e 67 73 28 70 4e 65 77 2c 20 28 73  indings(pNew, (s
7740: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 3b  qlite3_stmt*)p);
7750: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
7760: 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 28 56  setStepResult((V
7770: 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20 73 71  dbe*)pNew);.  sq
7780: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
7790: 65 28 28 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a  e((Vdbe*)pNew);.
77a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
77b0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 77  OK;.}.../*.** Tw
77c0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
77d0: 65 20 6f 66 66 69 63 69 61 6c 20 41 50 49 2e 20  e official API. 
77e0: 20 4c 65 67 61 63 79 20 61 6e 64 20 6e 65 77 20   Legacy and new 
77f0: 75 73 65 2e 20 20 49 6e 20 74 68 65 20 6c 65 67  use.  In the leg
7800: 61 63 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20  acy.** version, 
7810: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
7820: 20 74 65 78 74 20 69 73 20 6e 6f 74 20 73 61 76   text is not sav
7830: 65 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  ed in the prepar
7840: 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ed statement.** 
7850: 61 6e 64 20 73 6f 20 69 66 20 61 20 73 63 68 65  and so if a sche
7860: 6d 61 20 63 68 61 6e 67 65 20 6f 63 63 75 72 73  ma change occurs
7870: 2c 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  , SQLITE_SCHEMA 
7880: 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a  is returned by.*
7890: 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  * sqlite3_step()
78a0: 2e 20 20 49 6e 20 74 68 65 20 6e 65 77 20 76 65  .  In the new ve
78b0: 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69  rsion, the origi
78c0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20  nal SQL text is 
78d0: 72 65 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64 20  retained.** and 
78e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
78f0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72   automatically r
7900: 65 63 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e 20  ecompiled if an 
7910: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a 2a  schema change.**
7920: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
7930: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
7940: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
7970: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7980: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
7990: 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  /* UTF-8 encoded
79a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
79b0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79d0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
79e0: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
79f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
7a00: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
7a10: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
7a20: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
7a30: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
7a40: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
7a50: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
7a60: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
7a70: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
7a80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7a90: 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64  LockAndPrepare(d
7aa0: 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 30 2c  b,zSql,nBytes,0,
7ab0: 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29  0,ppStmt,pzTail)
7ac0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7ad0: 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53  ENABLE_SQLRR.  S
7ae0: 52 52 65 63 50 72 65 70 61 72 65 28 64 62 2c 20  RRecPrepare(db, 
7af0: 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 30 2c  zSql, nBytes, 0,
7b00: 20 2a 70 70 53 74 6d 74 29 3b 0a 23 65 6e 64 69   *ppStmt);.#endi
7b10: 66 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  f.  assert( rc==
7b20: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53  SQLITE_OK || ppS
7b30: 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d  tmt==0 || *ppStm
7b40: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49  t==0 );  /* VERI
7b50: 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20  FY: F13021 */.  
7b60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
7b70: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
7b80: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
7b90: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
7ba0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
7bb0: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
7bc0: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
7bd0: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
7be0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
7bf0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
7c00: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
7c10: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
7c20: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
7c30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
7c40: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
7c50: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
7c60: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
7c70: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
7c80: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
7c90: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
7ca0: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
7cb0: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
7cc0: 74 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45  t rc;.  /* EVIDE
7cd0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 32 33 2d  NCE-OF: R-37923-
7ce0: 31 32 31 37 33 20 54 68 65 20 73 71 6c 69 74 65  12173 The sqlite
7cf0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 69  3_prepare_v2() i
7d00: 6e 74 65 72 66 61 63 65 20 77 6f 72 6b 73 0a 20  nterface works. 
7d10: 20 2a 2a 20 65 78 61 63 74 6c 79 20 74 68 65 20   ** exactly the 
7d20: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
7d30: 70 72 65 70 61 72 65 5f 76 33 28 29 20 77 69 74  prepare_v3() wit
7d40: 68 20 61 20 7a 65 72 6f 20 70 72 65 70 46 6c 61  h a zero prepFla
7d50: 67 73 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  gs.  ** paramete
7d60: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 6f  r..  **.  ** Pro
7d70: 6f 66 20 69 6e 20 74 68 61 74 20 74 68 65 20 35  of in that the 5
7d80: 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  th parameter to 
7d90: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
7da0: 65 70 61 72 65 20 69 73 20 30 20 2a 2f 0a 20 20  epare is 0 */.  
7db0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b  rc = sqlite3Lock
7dc0: 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53  AndPrepare(db,zS
7dd0: 71 6c 2c 6e 42 79 74 65 73 2c 53 51 4c 49 54 45  ql,nBytes,SQLITE
7de0: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
7df0: 2c 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,0,.            
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b   ppStmt,pzTail);
7e20: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
7e30: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74  QLITE_OK || ppSt
7e40: 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74  mt==0 || *ppStmt
7e50: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
7e60: 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
7e70: 33 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20 20  3_prepare_v3(.  
7e80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
7e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
7ea0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f  abase handle. */
7eb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7ec0: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql,         /* 
7ed0: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51  UTF-8 encoded SQ
7ee0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  L statement. */.
7ef0: 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20    int nBytes,   
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7f10: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
7f20: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 6e 73   bytes. */.  uns
7f30: 69 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46 6c  igned int prepFl
7f40: 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72 6f 20 6f  ags,   /* Zero o
7f50: 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50 52  r more SQLITE_PR
7f60: 45 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  EPARE_* flags */
7f70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
7f80: 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20  **ppStmt,    /* 
7f90: 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74  OUT: A pointer t
7fa0: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
7fb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
7fc0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69  nst char **pzTai
7fd0: 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  l       /* OUT: 
7fe0: 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74  End of parsed st
7ff0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
8000: 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e   rc;.  /* EVIDEN
8010: 43 45 2d 4f 46 3a 20 52 2d 35 36 38 36 31 2d 34  CE-OF: R-56861-4
8020: 32 36 37 33 20 73 71 6c 69 74 65 33 5f 70 72 65  2673 sqlite3_pre
8030: 70 61 72 65 5f 76 33 28 29 20 64 69 66 66 65 72  pare_v3() differ
8040: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  s from.  ** sqli
8050: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
8060: 20 6f 6e 6c 79 20 69 6e 20 68 61 76 69 6e 67 20   only in having 
8070: 74 68 65 20 65 78 74 72 61 20 70 72 65 70 46 6c  the extra prepFl
8080: 61 67 73 20 70 61 72 61 6d 65 74 65 72 2c 0a 20  ags parameter,. 
8090: 20 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20 62   ** which is a b
80a0: 69 74 20 61 72 72 61 79 20 63 6f 6e 73 69 73 74  it array consist
80b0: 69 6e 67 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ing of zero or m
80c0: 6f 72 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ore of the.  ** 
80d0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a  SQLITE_PREPARE_*
80e0: 20 66 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a   flags..  **.  *
80f0: 2a 20 50 72 6f 6f 66 20 62 79 20 63 6f 6d 70 61  * Proof by compa
8100: 72 69 73 6f 6e 20 74 6f 20 74 68 65 20 69 6d 70  rison to the imp
8110: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
8120: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
8130: 32 28 29 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c  2().  ** directl
8140: 79 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 72 63  y above. */.  rc
8150: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e   = sqlite3LockAn
8160: 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c  dPrepare(db,zSql
8170: 2c 6e 42 79 74 65 73 2c 0a 20 20 20 20 20 20 20  ,nBytes,.       
8180: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
8190: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
81a0: 7c 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49  |(prepFlags&SQLI
81b0: 54 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29  TE_PREPARE_MASK)
81c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
81d0: 20 20 20 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61     0,ppStmt,pzTa
81e0: 69 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  il);.#ifdef SQLI
81f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a  TE_ENABLE_SQLRR.
8200: 20 20 53 52 52 65 63 50 72 65 70 61 72 65 28 64    SRRecPrepare(d
8210: 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c  b, zSql, nBytes,
8220: 20 31 2c 20 2a 70 70 53 74 6d 74 29 3b 0a 23 65   1, *ppStmt);.#e
8230: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72  ndif.  assert( r
8240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
8250: 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70  ppStmt==0 || *pp
8260: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Stmt==0 );.  ret
8270: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e  urn rc;.}...#ifn
8280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8290: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  UTF16./*.** Comp
82a0: 69 6c 65 20 74 68 65 20 55 54 46 2d 31 36 20 65  ile the UTF-16 e
82b0: 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65  ncoded SQL state
82c0: 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f 20 61  ment zSql into a
82d0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
82e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
82f0: 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31   sqlite3Prepare1
8300: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
8310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8320: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
8330: 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76  e. */ .  const v
8340: 6f 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  oid *zSql,      
8350: 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63     /* UTF-16 enc
8360: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
8370: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
8380: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
8390: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
83a0: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
83b0: 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67  /.  u32 prepFlag
83c0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
83d0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
83e0: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
83f0: 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
8400: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
8410: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
8420: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
8430: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8440: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
8450: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
8460: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
8470: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
8480: 7b 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  {.  /* This func
8490: 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 77  tion currently w
84a0: 6f 72 6b 73 20 62 79 20 66 69 72 73 74 20 74 72  orks by first tr
84b0: 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 55  ansforming the U
84c0: 54 46 2d 31 36 0a 20 20 2a 2a 20 65 6e 63 6f 64  TF-16.  ** encod
84d0: 65 64 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  ed string to UTF
84e0: 2d 38 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 69 6e  -8, then invokin
84f0: 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  g sqlite3_prepar
8500: 65 28 29 2e 20 54 68 65 0a 20 20 2a 2a 20 74 72  e(). The.  ** tr
8510: 69 63 6b 79 20 62 69 74 20 69 73 20 66 69 67 75  icky bit is figu
8520: 72 69 6e 67 20 6f 75 74 20 74 68 65 20 70 6f 69  ring out the poi
8530: 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 69  nter to return i
8540: 6e 20 2a 70 7a 54 61 69 6c 2e 0a 20 20 2a 2f 0a  n *pzTail..  */.
8550: 20 20 63 68 61 72 20 2a 7a 53 71 6c 38 3b 0a 20    char *zSql8;. 
8560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
8570: 69 6c 38 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  il8 = 0;.  int r
8580: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
8590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
85a0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
85b0: 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30 20 29   if( ppStmt==0 )
85c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
85d0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
85e0: 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  if.  *ppStmt = 0
85f0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
8600: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
8610: 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  )||zSql==0 ){.  
8620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8630: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
8640: 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3e 3d 30  .  if( nBytes>=0
8650: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a   ){.    int sz;.
8660: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8670: 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
8680: 29 7a 53 71 6c 3b 0a 20 20 20 20 66 6f 72 28 73  )zSql;.    for(s
8690: 7a 3d 30 3b 20 73 7a 3c 6e 42 79 74 65 73 20 26  z=0; sz<nBytes &
86a0: 26 20 28 7a 5b 73 7a 5d 21 3d 30 20 7c 7c 20 7a  & (z[sz]!=0 || z
86b0: 5b 73 7a 2b 31 5d 21 3d 30 29 3b 20 73 7a 20 2b  [sz+1]!=0); sz +
86c0: 3d 20 32 29 7b 7d 0a 20 20 20 20 6e 42 79 74 65  = 2){}.    nByte
86d0: 73 20 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 73 71  s = sz;.  }.  sq
86e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
86f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8700: 7a 53 71 6c 38 20 3d 20 73 71 6c 69 74 65 33 55  zSql8 = sqlite3U
8710: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 53 71 6c  tf16to8(db, zSql
8720: 2c 20 6e 42 79 74 65 73 2c 20 53 51 4c 49 54 45  , nBytes, SQLITE
8730: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
8740: 20 69 66 28 20 7a 53 71 6c 38 20 29 7b 0a 20 20   if( zSql8 ){.  
8750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
8760: 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c  ckAndPrepare(db,
8770: 20 7a 53 71 6c 38 2c 20 2d 31 2c 20 70 72 65 70   zSql8, -1, prep
8780: 46 6c 61 67 73 2c 20 30 2c 20 70 70 53 74 6d 74  Flags, 0, ppStmt
8790: 2c 20 26 7a 54 61 69 6c 38 29 3b 0a 20 20 7d 0a  , &zTail8);.  }.
87a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
87b0: 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52  ABLE_SQLRR.  SRR
87c0: 65 63 50 72 65 70 61 72 65 28 64 62 2c 20 7a 53  ecPrepare(db, zS
87d0: 71 6c 38 2c 20 2d 31 2c 20 31 2c 20 2a 70 70 53  ql8, -1, 1, *ppS
87e0: 74 6d 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  tmt);.#endif.  i
87f0: 66 28 20 7a 54 61 69 6c 38 20 26 26 20 70 7a 54  f( zTail8 && pzT
8800: 61 69 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ail ){.    /* If
8810: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
8820: 20 72 65 74 75 72 6e 73 20 61 20 74 61 69 6c 20   returns a tail 
8830: 70 6f 69 6e 74 65 72 2c 20 77 65 20 63 61 6c 63  pointer, we calc
8840: 75 6c 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ulate the.    **
8850: 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 69 6e   equivalent poin
8860: 74 65 72 20 69 6e 74 6f 20 74 68 65 20 55 54 46  ter into the UTF
8870: 2d 31 36 20 73 74 72 69 6e 67 20 62 79 20 63 6f  -16 string by co
8880: 75 6e 74 69 6e 67 20 74 68 65 20 75 6e 69 63 6f  unting the unico
8890: 64 65 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63  de.    ** charac
88a0: 74 65 72 73 20 62 65 74 77 65 65 6e 20 7a 53 71  ters between zSq
88b0: 6c 38 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20 61  l8 and zTail8, a
88c0: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 69 6e  nd then returnin
88d0: 67 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  g a pointer.    
88e0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ** the same numb
88f0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
8900: 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31 36   into the UTF-16
8910: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a   string..    */.
8920: 20 20 20 20 69 6e 74 20 63 68 61 72 73 5f 70 61      int chars_pa
8930: 72 73 65 64 20 3d 20 73 71 6c 69 74 65 33 55 74  rsed = sqlite3Ut
8940: 66 38 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38 2c  f8CharLen(zSql8,
8950: 20 28 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a 53   (int)(zTail8-zS
8960: 71 6c 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54 61  ql8));.    *pzTa
8970: 69 6c 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c 20  il = (u8 *)zSql 
8980: 2b 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79  + sqlite3Utf16By
8990: 74 65 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61 72  teLen(zSql, char
89a0: 73 5f 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a 20  s_parsed);.  }. 
89b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
89c0: 62 2c 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72 63  b, zSql8); .  rc
89d0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
89e0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
89f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8a00: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
8a10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8a20: 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
8a30: 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20  of the official 
8a40: 41 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64  API.  Legacy and
8a50: 20 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68   new use.  In th
8a60: 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73  e legacy.** vers
8a70: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
8a80: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f  l SQL text is no
8a90: 74 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70  t saved in the p
8aa0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8ab0: 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61  t.** and so if a
8ac0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f   schema change o
8ad0: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43  ccurs, SQLITE_SC
8ae0: 48 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64  HEMA is returned
8af0: 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73   by.** sqlite3_s
8b00: 74 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e  tep().  In the n
8b10: 65 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ew version, the 
8b20: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
8b30: 74 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a  t is retained.**
8b40: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
8b50: 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  nt is automatica
8b60: 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69  lly recompiled i
8b70: 66 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e  f an schema chan
8b80: 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  ge.** occurs..*/
8b90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  .int sqlite3_pre
8ba0: 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65  pare16(.  sqlite
8bb0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
8bc0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8bd0: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
8be0: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
8bf0: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31          /* UTF-1
8c00: 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  6 encoded SQL st
8c10: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
8c20: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
8c30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
8c40: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
8c50: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
8c60: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
8c70: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
8c80: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
8c90: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
8ca0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
8cb0: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
8cc0: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
8cd0: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
8ce0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
8cf0: 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  = sqlite3Prepare
8d00: 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  16(db,zSql,nByte
8d10: 73 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69  s,0,ppStmt,pzTai
8d20: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
8d30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
8d40: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
8d50: 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45  tmt==0 );  /* VE
8d60: 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a  RIFY: F13021 */.
8d70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
8d80: 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  nt sqlite3_prepa
8d90: 72 65 31 36 5f 76 32 28 0a 20 20 73 71 6c 69 74  re16_v2(.  sqlit
8da0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
8db0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8dc0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63   handle. */ .  c
8dd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c  onst void *zSql,
8de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
8df0: 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  16 encoded SQL s
8e00: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
8e10: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
8e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
8e30: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
8e40: 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tes. */.  sqlite
8e50: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
8e60: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
8e70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
8e80: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8e90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
8ea0: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
8eb0: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
8ec0: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
8ed0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
8ee0: 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72   = sqlite3Prepar
8ef0: 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  e16(db,zSql,nByt
8f00: 65 73 2c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  es,SQLITE_PREPAR
8f10: 45 5f 53 41 56 45 53 51 4c 2c 70 70 53 74 6d 74  E_SAVESQL,ppStmt
8f20: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
8f30: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
8f40: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
8f50: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
8f60: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
8f70: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
8f80: 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
8f90: 5f 70 72 65 70 61 72 65 31 36 5f 76 33 28 0a 20  _prepare16_v3(. 
8fa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
8fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
8fc0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
8fd0: 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  / .  const void 
8fe0: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f  *zSql,         /
8ff0: 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  * UTF-16 encoded
9000: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
9010: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9030: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
9040: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
9050: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65  unsigned int pre
9060: 70 46 6c 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72  pFlags,   /* Zer
9070: 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45  o or more SQLITE
9080: 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73  _PREPARE_* flags
9090: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
90a0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
90b0: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
90c0: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
90d0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
90e0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a   const void **pz
90f0: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
9100: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
9110: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
9120: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
9130: 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36 28  qlite3Prepare16(
9140: 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 0a  db,zSql,nBytes,.
9150: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
9160: 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c 7c  PREPARE_SAVESQL|
9170: 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49 54  (prepFlags&SQLIT
9180: 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c  E_PREPARE_MASK),
9190: 0a 20 20 20 20 20 20 20 20 20 70 70 53 74 6d 74  .         ppStmt
91a0: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
91b0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
91c0: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
91d0: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
91e0: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
91f0: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
9200: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
9210: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
9220: 36 20 2a 2f 0a                                   6 */.