/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 03944762a1f677696cf1a69a889758782f6e05ce88f81e84504ab5b4c7e46e76:


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 53 51 4c 49  ->flags &= ~SQLI
2850: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
2860: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
2870: 20 74 68 65 20 73 63 68 65 6d 61 20 69 6e 66 6f   the schema info
2880: 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 74  rmation out of t
2890: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  he schema tables
28a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
28c0: 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  .  {.    char *z
28d0: 53 71 6c 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  Sql;.    zSql = 
28e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
28f0: 62 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  b, .        "SEL
2900: 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61  ECT name, rootpa
2910: 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20 5c 22 25  ge, sql FROM \"%
2920: 77 5c 22 2e 25 73 20 4f 52 44 45 52 20 42 59 20  w\".%s ORDER BY 
2930: 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 20  rowid",.        
2940: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
2950: 53 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 4e 61  SName, zMasterNa
2960: 6d 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  me);.#ifndef SQL
2970: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
2980: 5a 41 54 49 4f 4e 0a 20 20 20 20 7b 0a 20 20 20  ZATION.    {.   
2990: 20 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68     sqlite3_xauth
29a0: 20 78 41 75 74 68 3b 0a 20 20 20 20 20 20 78 41   xAuth;.      xA
29b0: 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
29c0: 0a 20 20 20 20 20 20 64 62 2d 3e 78 41 75 74 68  .      db->xAuth
29d0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
29e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
29f0: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73  exec(db, zSql, s
2a00: 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61  qlite3InitCallba
2a10: 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c 20 30  ck, &initData, 0
2a20: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2a30: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
2a40: 54 49 4f 4e 0a 20 20 20 20 20 20 64 62 2d 3e 78  TION.      db->x
2a50: 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 20 20  Auth = xAuth;.  
2a60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
2a70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a80: 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61   ) rc = initData
2a90: 2e 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .rc;.    sqlite3
2aa0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2ab0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2ac0: 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20  _OMIT_ANALYZE.  
2ad0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ae0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2af0: 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64  ite3AnalysisLoad
2b00: 28 64 62 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  (db, iDb);.    }
2b10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2b20: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b30: 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
2b40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2b50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
2b60: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
2b70: 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
2b80: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2b90: 54 45 5f 4f 4b 20 7c 7c 20 28 64 62 2d 3e 66 6c  TE_OK || (db->fl
2ba0: 61 67 73 26 53 51 4c 49 54 45 5f 57 72 69 74 65  ags&SQLITE_Write
2bb0: 53 63 68 65 6d 61 29 29 7b 0a 20 20 20 20 2f 2a  Schema)){.    /*
2bc0: 20 42 6c 61 63 6b 20 6d 61 67 69 63 3a 20 49 66   Black magic: If
2bd0: 20 74 68 65 20 53 51 4c 49 54 45 5f 57 72 69 74   the SQLITE_Writ
2be0: 65 53 63 68 65 6d 61 20 66 6c 61 67 20 69 73 20  eSchema flag is 
2bf0: 73 65 74 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  set, then consid
2c00: 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  er.    ** the sc
2c10: 68 65 6d 61 20 6c 6f 61 64 65 64 2c 20 65 76 65  hema loaded, eve
2c20: 6e 20 69 66 20 65 72 72 6f 72 73 20 6f 63 63 75  n if errors occu
2c30: 72 72 65 64 2e 20 49 6e 20 74 68 69 73 20 73 69  rred. In this si
2c40: 74 75 61 74 69 6f 6e 20 74 68 65 20 0a 20 20 20  tuation the .   
2c50: 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 71 6c 69   ** current sqli
2c60: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f 70  te3_prepare() op
2c70: 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 66 61 69  eration will fai
2c80: 6c 2c 20 62 75 74 20 74 68 65 20 66 6f 6c 6c 6f  l, but the follo
2c90: 77 69 6e 67 20 6f 6e 65 0a 20 20 20 20 2a 2a 20  wing one.    ** 
2ca0: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  will attempt to 
2cb0: 63 6f 6d 70 69 6c 65 20 74 68 65 20 73 75 70 70  compile the supp
2cc0: 6c 69 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  lied statement a
2cd0: 67 61 69 6e 73 74 20 77 68 61 74 65 76 65 72 20  gainst whatever 
2ce0: 73 75 62 73 65 74 0a 20 20 20 20 2a 2a 20 6f 66  subset.    ** of
2cf0: 20 74 68 65 20 73 63 68 65 6d 61 20 77 61 73 20   the schema was 
2d00: 6c 6f 61 64 65 64 20 62 65 66 6f 72 65 20 74 68  loaded before th
2d10: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
2d20: 2e 20 54 68 65 20 70 72 69 6d 61 72 79 0a 20 20  . The primary.  
2d30: 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20    ** purpose of 
2d40: 74 68 69 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77  this is to allow
2d50: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 73   access to the s
2d60: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2d70: 6c 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  le.    ** even w
2d80: 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  hen its contents
2d90: 20 68 61 76 65 20 62 65 65 6e 20 63 6f 72 72 75   have been corru
2da0: 70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pted..    */.   
2db0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
2dc0: 62 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d  b, iDb, DB_Schem
2dd0: 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 72 63  aLoaded);.    rc
2de0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2df0: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
2e00: 65 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 74  e for an error t
2e10: 68 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  hat occurs after
2e20: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6c   successfully al
2e30: 6c 6f 63 61 74 69 6e 67 0a 20 20 2a 2a 20 63 75  locating.  ** cu
2e40: 72 4d 61 69 6e 20 61 6e 64 20 63 61 6c 6c 69 6e  rMain and callin
2e50: 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  g sqlite3BtreeEn
2e60: 74 65 72 28 29 2e 20 46 6f 72 20 61 6e 20 65 72  ter(). For an er
2e70: 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 0a  ror that occurs.
2e80: 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 61 74    ** before that
2e90: 20 70 6f 69 6e 74 2c 20 6a 75 6d 70 20 74 6f 20   point, jump to 
2ea0: 65 72 72 6f 72 5f 6f 75 74 2e 0a 20 20 2a 2f 0a  error_out..  */.
2eb0: 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75  initone_error_ou
2ec0: 74 3a 0a 20 20 69 66 28 20 6f 70 65 6e 65 64 54  t:.  if( openedT
2ed0: 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
2ee0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
2ef0: 6d 6d 69 74 28 70 44 62 2d 3e 70 42 74 29 3b 0a  mmit(pDb->pBt);.
2f00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
2f10: 65 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74  eeLeave(pDb->pBt
2f20: 29 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  );..error_out:. 
2f30: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2f40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
2f50: 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  MEM || rc==SQLIT
2f60: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
2f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
2f80: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
2f90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  }.    sqlite3Res
2fa0: 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20  etOneSchema(db, 
2fb0: 69 44 62 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  iDb);.  }.  db->
2fc0: 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20  init.busy = 0;. 
2fd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fe0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2ff0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
3000: 65 73 20 2d 20 74 68 65 20 6d 61 69 6e 20 64 61  es - the main da
3010: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
3020: 20 66 69 6c 65 0a 2a 2a 20 75 73 65 64 20 74 6f   file.** used to
3030: 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72 79   store temporary
3040: 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 61 6e 79   tables, and any
3050: 20 61 64 64 69 74 69 6f 6e 61 6c 20 64 61 74 61   additional data
3060: 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a 20 63 72  base files.** cr
3070: 65 61 74 65 64 20 75 73 69 6e 67 20 41 54 54 41  eated using ATTA
3080: 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  CH statements.  
3090: 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
30a0: 20 63 6f 64 65 2e 20 20 49 66 20 61 6e 0a 2a 2a   code.  If an.**
30b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
30c0: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
30d0: 73 73 61 67 65 20 69 6e 74 6f 20 2a 70 7a 45 72  ssage into *pzEr
30e0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  rMsg..**.** Afte
30f0: 72 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  r a database is 
3100: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65  initialized, the
3110: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
3120: 20 62 69 74 20 69 73 20 73 65 74 0a 2a 2a 20 62   bit is set.** b
3130: 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
3140: 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
3150: 74 68 65 20 44 62 20 73 74 72 75 63 74 75 72 65  the Db structure
3160: 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
3170: 65 0a 2a 2a 20 66 69 6c 65 20 77 61 73 20 6f 66  e.** file was of
3180: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 2c 20 74 68   zero-length, th
3190: 65 6e 20 74 68 65 20 44 42 5f 45 6d 70 74 79 20  en the DB_Empty 
31a0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74  flag is also set
31b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31c0: 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
31d0: 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73  , char **pzErrMs
31e0: 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b  g){.  int i, rc;
31f0: 0a 20 20 69 6e 74 20 63 6f 6d 6d 69 74 5f 69 6e  .  int commit_in
3200: 74 65 72 6e 61 6c 20 3d 20 21 28 64 62 2d 3e 6d  ternal = !(db->m
3210: 44 62 46 6c 61 67 73 26 44 42 46 4c 41 47 5f 53  DbFlags&DBFLAG_S
3220: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
3230: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3240: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
3250: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
3260: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
3270: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d  eeHoldsMutex(db-
3280: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 20 29 3b 0a  >aDb[0].pBt) );.
3290: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
32a0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
32b0: 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41  ENC(db) = SCHEMA
32c0: 5f 45 4e 43 28 64 62 29 3b 0a 20 20 61 73 73 65  _ENC(db);.  asse
32d0: 72 74 28 20 64 62 2d 3e 6e 44 62 3e 30 20 29 3b  rt( db->nDb>0 );
32e0: 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 6d 61 69  .  /* Do the mai
32f0: 6e 20 73 63 68 65 6d 61 20 66 69 72 73 74 20 2a  n schema first *
3300: 2f 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  /.  if( !DbHasPr
3310: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
3320: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
3330: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
3340: 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20 30 2c  e3InitOne(db, 0,
3350: 20 70 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20   pzErrMsg, 0);. 
3360: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
3370: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20  rn rc;.  }.  /* 
3380: 41 6c 6c 20 6f 74 68 65 72 20 73 63 68 65 6d 61  All other schema
3390: 73 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e  s after the main
33a0: 20 73 63 68 65 6d 61 2e 20 54 68 65 20 22 74 65   schema. The "te
33b0: 6d 70 22 20 73 63 68 65 6d 61 20 6d 75 73 74 20  mp" schema must 
33c0: 62 65 20 6c 61 73 74 20 2a 2f 0a 20 20 66 6f 72  be last */.  for
33d0: 28 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 3e  (i=db->nDb-1; i>
33e0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 73 73  0; i--){.    ass
33f0: 65 72 74 28 20 69 3d 3d 31 20 7c 7c 20 73 71 6c  ert( i==1 || sql
3400: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
3410: 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  tex(db->aDb[i].p
3420: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21  Bt) );.    if( !
3430: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
3440: 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , i, DB_SchemaLo
3450: 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 72  aded) ){.      r
3460: 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 4f  c = sqlite3InitO
3470: 6e 65 28 64 62 2c 20 69 2c 20 70 7a 45 72 72 4d  ne(db, i, pzErrM
3480: 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  sg, 0);.      if
3490: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
34a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
34b0: 28 20 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61  ( commit_interna
34c0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
34d0: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
34e0: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 20  anges(db);.  }. 
34f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3500: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
3510: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
3520: 2d 6f 70 20 69 66 20 74 68 65 20 64 61 74 61 62  -op if the datab
3530: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
3540: 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
3550: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
3560: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6c   the schema is l
3570: 6f 61 64 65 64 2e 20 41 6e 20 65 72 72 6f 72 20  oaded. An error 
3580: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
3590: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35a0: 52 65 61 64 53 63 68 65 6d 61 28 50 61 72 73 65  ReadSchema(Parse
35b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
35c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
35e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
35f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3600: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
3610: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 21 64  tex) );.  if( !d
3620: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
3630: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3640: 49 6e 69 74 28 64 62 2c 20 26 70 50 61 72 73 65  Init(db, &pParse
3650: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
3660: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3670: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  K ){.      pPars
3680: 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
3690: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
36a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36b0: 64 62 2d 3e 6e 6f 53 68 61 72 65 64 43 61 63 68  db->noSharedCach
36c0: 65 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  e ){.      db->m
36d0: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
36e0: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b  G_SchemaKnownOk;
36f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3700: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
3710: 2a 20 43 68 65 63 6b 20 73 63 68 65 6d 61 20 63  * Check schema c
3720: 6f 6f 6b 69 65 73 20 69 6e 20 61 6c 6c 20 64 61  ookies in all da
3730: 74 61 62 61 73 65 73 2e 20 20 49 66 20 61 6e 79  tabases.  If any
3740: 20 63 6f 6f 6b 69 65 20 69 73 20 6f 75 74 0a 2a   cookie is out.*
3750: 2a 20 6f 66 20 64 61 74 65 20 73 65 74 20 70 50  * of date set pP
3760: 61 72 73 65 2d 3e 72 63 20 74 6f 20 53 51 4c 49  arse->rc to SQLI
3770: 54 45 5f 53 43 48 45 4d 41 2e 20 20 49 66 20 61  TE_SCHEMA.  If a
3780: 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
3790: 73 0a 2a 2a 20 6d 61 6b 65 20 6e 6f 20 63 68 61  s.** make no cha
37a0: 6e 67 65 73 20 74 6f 20 70 50 61 72 73 65 2d 3e  nges to pParse->
37b0: 72 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rc..*/.static vo
37c0: 69 64 20 73 63 68 65 6d 61 49 73 56 61 6c 69 64  id schemaIsValid
37d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
37e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
37f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
3800: 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 72 63  nt iDb;.  int rc
3810: 3b 0a 20 20 69 6e 74 20 63 6f 6f 6b 69 65 3b 0a  ;.  int cookie;.
3820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
3830: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 29  e->checkSchema )
3840: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3850: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
3860: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  b->mutex) );.  f
3870: 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
3880: 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
3890: 20 20 20 69 6e 74 20 6f 70 65 6e 65 64 54 72 61     int openedTra
38a0: 6e 73 61 63 74 69 6f 6e 20 3d 20 30 3b 20 20 20  nsaction = 0;   
38b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
38c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
38d0: 73 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  s opened */.    
38e0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
38f0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 20 20  >aDb[iDb].pBt;  
3900: 20 20 20 2f 2a 20 42 74 72 65 65 20 64 61 74 61     /* Btree data
3910: 62 61 73 65 20 74 6f 20 72 65 61 64 20 63 6f 6f  base to read coo
3920: 6b 69 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  kie from */.    
3930: 69 66 28 20 70 42 74 3d 3d 30 20 29 20 63 6f 6e  if( pBt==0 ) con
3940: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  tinue;..    /* I
3950: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  f there is not a
3960: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6f 6e  lready a read-on
3970: 6c 79 20 28 6f 72 20 72 65 61 64 2d 77 72 69 74  ly (or read-writ
3980: 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  e) transaction o
3990: 70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20  pened.    ** on 
39a0: 74 68 65 20 62 2d 74 72 65 65 20 64 61 74 61 62  the b-tree datab
39b0: 61 73 65 2c 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f  ase, open one no
39c0: 77 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  w. If a transact
39d0: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20 69  ion is opened, i
39e0: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
39f0: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
3a00: 74 65 6c 79 20 61 66 74 65 72 20 72 65 61 64 69  tely after readi
3a10: 6e 67 20 74 68 65 20 6d 65 74 61 2d 76 61 6c 75  ng the meta-valu
3a20: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73  e. */.    if( !s
3a30: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
3a40: 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b  eadTrans(pBt) ){
3a50: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3a60: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
3a70: 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  ns(pBt, 0, 0);. 
3a80: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3a90: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d  ITE_NOMEM || rc=
3aa0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
3ab0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MEM ){.        s
3ac0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
3ad0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
3ae0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3af0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _OK ) return;.  
3b00: 20 20 20 20 6f 70 65 6e 65 64 54 72 61 6e 73 61      openedTransa
3b10: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  ction = 1;.    }
3b20: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
3b30: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
3b40: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
3b50: 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  e. If it does no
3b60: 74 20 6d 61 74 63 68 20 74 68 65 20 0a 20 20 20  t match the .   
3b70: 20 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64   ** value stored
3b80: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
3b90: 69 6e 2d 6d 65 6d 6f 72 79 20 73 63 68 65 6d 61  in-memory schema
3ba0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c   representation,
3bb0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 50 61 72 73  .    ** set Pars
3bc0: 65 2e 72 63 20 74 6f 20 53 51 4c 49 54 45 5f 53  e.rc to SQLITE_S
3bd0: 43 48 45 4d 41 2e 20 2a 2f 0a 20 20 20 20 73 71  CHEMA. */.    sq
3be0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
3bf0: 61 28 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48  a(pBt, BTREE_SCH
3c00: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33  EMA_VERSION, (u3
3c10: 32 20 2a 29 26 63 6f 6f 6b 69 65 29 3b 0a 20 20  2 *)&cookie);.  
3c20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c30: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3c40: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3c50: 20 20 20 20 69 66 28 20 63 6f 6f 6b 69 65 21 3d      if( cookie!=
3c60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3c70: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
3c80: 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  kie ){.      sql
3c90: 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65  ite3ResetOneSche
3ca0: 6d 61 28 64 62 2c 20 69 44 62 29 3b 0a 20 20 20  ma(db, iDb);.   
3cb0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
3cc0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20  SQLITE_SCHEMA;. 
3cd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f     }..    /* Clo
3ce0: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
3cf0: 6f 6e 2c 20 69 66 20 6f 6e 65 20 77 61 73 20 6f  on, if one was o
3d00: 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  pened. */.    if
3d10: 28 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74  ( openedTransact
3d20: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ion ){.      sql
3d30: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
3d40: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
3d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
3d60: 20 61 20 73 63 68 65 6d 61 20 70 6f 69 6e 74 65   a schema pointe
3d70: 72 20 69 6e 74 6f 20 74 68 65 20 69 44 62 20 69  r into the iDb i
3d80: 6e 64 65 78 20 74 68 61 74 20 69 6e 64 69 63 61  ndex that indica
3d90: 74 65 73 0a 2a 2a 20 77 68 69 63 68 20 64 61 74  tes.** which dat
3da0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 64 62  abase file in db
3db0: 2d 3e 61 44 62 5b 5d 20 74 68 65 20 73 63 68 65  ->aDb[] the sche
3dc0: 6d 61 20 72 65 66 65 72 73 20 74 6f 2e 0a 2a 2a  ma refers to..**
3dd0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 61 6d 65 20  .** If the same 
3de0: 64 61 74 61 62 61 73 65 20 69 73 20 61 74 74 61  database is atta
3df0: 63 68 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ched more than o
3e00: 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74 0a 2a  nce, the first.*
3e10: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
3e20: 61 73 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ase is returned.
3e30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
3e40: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 73 71 6c  chemaToIndex(sql
3e50: 69 74 65 33 20 2a 64 62 2c 20 53 63 68 65 6d 61  ite3 *db, Schema
3e60: 20 2a 70 53 63 68 65 6d 61 29 7b 0a 20 20 69 6e   *pSchema){.  in
3e70: 74 20 69 20 3d 20 2d 31 30 30 30 30 30 30 3b 0a  t i = -1000000;.
3e80: 0a 20 20 2f 2a 20 49 66 20 70 53 63 68 65 6d 61  .  /* If pSchema
3e90: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
3ea0: 65 74 75 72 6e 20 2d 31 30 30 30 30 30 30 2e 20  eturn -1000000. 
3eb0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
3ec0: 6e 20 63 6f 64 65 20 69 6e 20 0a 20 20 2a 2a 20  n code in .  ** 
3ed0: 65 78 70 72 2e 63 20 69 73 20 74 72 79 69 6e 67  expr.c is trying
3ee0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 61 20 72 65   to resolve a re
3ef0: 66 65 72 65 6e 63 65 20 74 6f 20 61 20 74 72 61  ference to a tra
3f00: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 28 69 2e  nsient table (i.
3f10: 65 2e 20 6f 6e 65 0a 20 20 2a 2a 20 63 72 65 61  e. one.  ** crea
3f20: 74 65 64 20 62 79 20 61 20 73 75 62 2d 73 65 6c  ted by a sub-sel
3f30: 65 63 74 29 2e 20 49 6e 20 74 68 69 73 20 63 61  ect). In this ca
3f40: 73 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  se the return va
3f50: 6c 75 65 20 6f 66 20 74 68 69 73 20 0a 20 20 2a  lue of this .  *
3f60: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  * function shoul
3f70: 64 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  d never be used.
3f80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 72 65  .  **.  ** We re
3f90: 74 75 72 6e 20 2d 31 30 30 30 30 30 30 20 69 6e  turn -1000000 in
3fa0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6d 6f 72  stead of the mor
3fb0: 65 20 75 73 75 61 6c 20 2d 31 20 73 69 6d 70 6c  e usual -1 simpl
3fc0: 79 20 62 65 63 61 75 73 65 20 75 73 69 6e 67 0a  y because using.
3fd0: 20 20 2a 2a 20 2d 31 30 30 30 30 30 30 20 61 73    ** -1000000 as
3fe0: 20 74 68 65 20 69 6e 63 6f 72 72 65 63 74 20 69   the incorrect i
3ff0: 6e 64 65 78 20 69 6e 74 6f 20 64 62 2d 3e 61 44  ndex into db->aD
4000: 62 5b 5d 20 69 73 20 6d 75 63 68 20 0a 20 20 2a  b[] is much .  *
4010: 2a 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f  * more likely to
4020: 20 63 61 75 73 65 20 61 20 73 65 67 66 61 75 6c   cause a segfaul
4030: 74 20 74 68 61 6e 20 2d 31 20 28 6f 66 20 63 6f  t than -1 (of co
4040: 75 72 73 65 20 74 68 65 72 65 20 61 72 65 20 61  urse there are a
4050: 73 73 65 72 74 28 29 0a 20 20 2a 2a 20 73 74 61  ssert().  ** sta
4060: 74 65 6d 65 6e 74 73 20 74 6f 6f 2c 20 62 75 74  tements too, but
4070: 20 69 74 20 6e 65 76 65 72 20 68 75 72 74 73 20   it never hurts 
4080: 74 6f 20 70 6c 61 79 20 74 68 65 20 6f 64 64 73  to play the odds
4090: 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
40a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
40b0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
40c0: 29 3b 0a 20 20 69 66 28 20 70 53 63 68 65 6d 61  );.  if( pSchema
40d0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
40e0: 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20   1; i++){.      
40f0: 61 73 73 65 72 74 28 20 69 3c 64 62 2d 3e 6e 44  assert( i<db->nD
4100: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  b );.      if( d
4110: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
4120: 61 3d 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  a==pSchema ){.  
4130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4140: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
4150: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4160: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7d 0a  <db->nDb );.  }.
4170: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4180: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
4190: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
41a0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 6f   in the pParse o
41b0: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
41c0: 6c 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74  lite3ParserReset
41d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
41e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
41f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
4200: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4210: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29   pParse->aLabel)
4220: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
4230: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 50  istDelete(db, pP
4240: 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
4250: 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  );.  if( db ){. 
4260: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c     assert( db->l
4270: 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
4280: 65 20 3e 3d 20 70 50 61 72 73 65 2d 3e 64 69 73  e >= pParse->dis
4290: 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 29 3b  ableLookaside );
42a0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
42b0: 64 65 2e 62 44 69 73 61 62 6c 65 20 2d 3d 20 70  de.bDisable -= p
42c0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f  Parse->disableLo
42d0: 6f 6b 61 73 69 64 65 3b 0a 20 20 7d 0a 20 20 70  okaside;.  }.  p
42e0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f  Parse->disableLo
42f0: 6f 6b 61 73 69 64 65 20 3d 20 30 3b 0a 7d 0a 0a  okaside = 0;.}..
4300: 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74 68  /*.** Compile th
4310: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
4320: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a 53  SQL statement zS
4330: 71 6c 20 69 6e 74 6f 20 61 20 73 74 61 74 65 6d  ql into a statem
4340: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
4350: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
4360: 33 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69  3Prepare(.  sqli
4370: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
4380: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4390: 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63  e handle. */.  c
43a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
43c0: 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  8 encoded SQL st
43d0: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
43e0: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
43f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
4400: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
4410: 65 73 2e 20 2a 2f 0a 20 20 75 33 32 20 70 72 65  es. */.  u32 pre
4420: 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
4430: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
4440: 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  re SQLITE_PREPAR
4450: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 56  E_* flags */.  V
4460: 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 2c  dbe *pReprepare,
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 62           /* VM b
4480: 65 69 6e 67 20 72 65 70 72 65 70 61 72 65 64 20  eing reprepared 
4490: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
44a0: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f  t **ppStmt,    /
44b0: 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72  * OUT: A pointer
44c0: 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   to the prepared
44d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
44e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54  const char **pzT
44f0: 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ail       /* OUT
4500: 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20  : End of parsed 
4510: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  string */.){.  c
4520: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
4530: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  ;        /* Erro
4540: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
4550: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4560: 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
4570: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  lt code */.  int
4580: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4590: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
45a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 61 72 73  ounter */.  Pars
45b0: 65 20 73 50 61 72 73 65 3b 20 20 20 20 20 20 20  e sParse;       
45c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
45d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20 20 6d   context */..  m
45e0: 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30  emset(&sParse, 0
45f0: 2c 20 50 41 52 53 45 5f 48 44 52 5f 53 5a 29 3b  , PARSE_HDR_SZ);
4600: 0a 20 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f  .  memset(PARSE_
4610: 54 41 49 4c 28 26 73 50 61 72 73 65 29 2c 20 30  TAIL(&sParse), 0
4620: 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29  , PARSE_TAIL_SZ)
4630: 3b 0a 20 20 73 50 61 72 73 65 2e 70 52 65 70 72  ;.  sParse.pRepr
4640: 65 70 61 72 65 20 3d 20 70 52 65 70 72 65 70 61  epare = pReprepa
4650: 72 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70  re;.  assert( pp
4660: 53 74 6d 74 20 26 26 20 2a 70 70 53 74 6d 74 3d  Stmt && *ppStmt=
4670: 3d 30 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72  =0 );.  /* asser
4680: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
4690: 69 6c 65 64 20 29 3b 20 2f 2f 20 6e 6f 74 20 74  iled ); // not t
46a0: 72 75 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  rue with SQLITE_
46b0: 55 53 45 5f 41 4c 4c 4f 43 41 20 2a 2f 0a 20 20  USE_ALLOCA */.  
46c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
46d0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
46e0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  utex) );..  /* F
46f0: 6f 72 20 61 20 6c 6f 6e 67 2d 74 65 72 6d 20 75  or a long-term u
4700: 73 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  se prepared stat
4710: 65 6d 65 6e 74 20 61 76 6f 69 64 20 74 68 65 20  ement avoid the 
4720: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 6c 6f 6f 6b  use of.  ** look
4730: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 20 20  aside memory..  
4740: 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 46 6c 61  */.  if( prepFla
4750: 67 73 20 26 20 53 51 4c 49 54 45 5f 50 52 45 50  gs & SQLITE_PREP
4760: 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 20 29  ARE_PERSISTENT )
4770: 7b 0a 20 20 20 20 73 50 61 72 73 65 2e 64 69 73  {.    sParse.dis
4780: 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 2b 2b 3b  ableLookaside++;
4790: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
47a0: 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20  de.bDisable++;. 
47b0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
47c0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74  o verify that it
47d0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
47e0: 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  get a read lock 
47f0: 6f 6e 20 61 6c 6c 0a 20 20 2a 2a 20 64 61 74 61  on all.  ** data
4800: 62 61 73 65 20 73 63 68 65 6d 61 73 2e 20 20 54  base schemas.  T
4810: 68 65 20 69 6e 61 62 69 6c 69 74 79 20 74 6f 20  he inability to 
4820: 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  get a read lock 
4830: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 20  indicates that. 
4840: 20 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   ** some other d
4850: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4860: 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  on is holding a 
4870: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 77 68 69 63  write-lock, whic
4880: 68 20 69 6e 0a 20 20 2a 2a 20 74 75 72 6e 20 6d  h in.  ** turn m
4890: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 74  eans that the ot
48a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
48b0: 61 73 20 6d 61 64 65 20 75 6e 63 6f 6d 6d 69 74  as made uncommit
48c0: 74 65 64 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ted changes.  **
48d0: 20 74 6f 20 74 68 65 20 73 63 68 65 6d 61 2e 0a   to the schema..
48e0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 72 65 20 77    **.  ** Were w
48f0: 65 20 74 6f 20 70 72 6f 63 65 65 64 20 61 6e 64  e to proceed and
4900: 20 70 72 65 70 61 72 65 20 74 68 65 20 73 74 61   prepare the sta
4910: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 74  tement against t
4920: 68 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a 20  he uncommitted. 
4930: 20 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67   ** schema chang
4940: 65 73 20 61 6e 64 20 69 66 20 74 68 6f 73 65 20  es and if those 
4950: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
4960: 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20  re subsequently 
4970: 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
4980: 20 61 6e 64 20 64 69 66 66 65 72 65 6e 74 20 63   and different c
4990: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
49a0: 69 6e 20 74 68 65 69 72 20 70 6c 61 63 65 2c 20  in their place, 
49b0: 74 68 65 6e 20 77 68 65 6e 20 74 68 69 73 0a 20  then when this. 
49c0: 20 2a 2a 20 70 72 65 70 61 72 65 64 20 73 74 61   ** prepared sta
49d0: 74 65 6d 65 6e 74 20 67 6f 65 73 20 74 6f 20 72  tement goes to r
49e0: 75 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  un the schema co
49f0: 6f 6b 69 65 20 77 6f 75 6c 64 20 66 61 69 6c 20  okie would fail 
4a00: 74 6f 20 64 65 74 65 63 74 0a 20 20 2a 2a 20 74  to detect.  ** t
4a10: 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  he schema change
4a20: 2e 20 20 44 69 73 61 73 74 65 72 20 77 6f 75 6c  .  Disaster woul
4a30: 64 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2a 0a 20  d follow..  **. 
4a40: 20 2a 2a 20 54 68 69 73 20 74 68 72 65 61 64 20   ** This thread 
4a50: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c  is currently hol
4a60: 64 69 6e 67 20 6d 75 74 65 78 65 73 20 6f 6e 20  ding mutexes on 
4a70: 61 6c 6c 20 42 74 72 65 65 73 20 28 62 65 63 61  all Btrees (beca
4a80: 75 73 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  use.  ** of the 
4a90: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
4aa0: 72 41 6c 6c 28 29 20 69 6e 20 73 71 6c 69 74 65  rAll() in sqlite
4ab0: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28  3LockAndPrepare(
4ac0: 29 29 20 73 6f 20 69 74 0a 20 20 2a 2a 20 69 73  )) so it.  ** is
4ad0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
4ae0: 72 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  r another thread
4af0: 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
4b00: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 20 20  schema change.  
4b10: 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f  ** while this ro
4b20: 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67  utine is running
4b30: 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 64 6f 20  .  Hence, we do 
4b40: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 68 6f 6c 64  not need to hold
4b50: 20 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20   .  ** locks on 
4b60: 74 68 65 20 73 63 68 65 6d 61 2c 20 77 65 20 6a  the schema, we j
4b70: 75 73 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  ust need to make
4b80: 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 65 6c 73   sure nobody els
4b90: 65 20 69 73 20 0a 20 20 2a 2a 20 68 6f 6c 64 69  e is .  ** holdi
4ba0: 6e 67 20 74 68 65 6d 2e 0a 20 20 2a 2a 0a 20 20  ng them..  **.  
4bb0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73 65 74  ** Note that set
4bc0: 74 69 6e 67 20 52 45 41 44 5f 55 4e 43 4f 4d 4d  ting READ_UNCOMM
4bd0: 49 54 54 45 44 20 6f 76 65 72 72 69 64 65 73 20  ITTED overrides 
4be0: 6d 6f 73 74 20 6c 6f 63 6b 20 64 65 74 65 63 74  most lock detect
4bf0: 69 6f 6e 2c 0a 20 20 2a 2a 20 62 75 74 20 69 74  ion,.  ** but it
4c00: 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 6f 76 65 72   does *not* over
4c10: 72 69 64 65 20 73 63 68 65 6d 61 20 6c 6f 63 6b  ride schema lock
4c20: 20 64 65 74 65 63 74 69 6f 6e 2c 20 73 6f 20 74   detection, so t
4c30: 68 69 73 20 61 6c 6c 20 73 74 69 6c 6c 0a 20 20  his all still.  
4c40: 2a 2a 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66  ** works even if
4c50: 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
4c60: 44 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  D is set..  */. 
4c70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4c80: 6e 44 62 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  nDb; i++) {.    
4c90: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
4ca0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
4cb0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
4cc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4cd0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
4ce0: 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
4cf0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
4d00: 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 70 42 74  SchemaLocked(pBt
4d10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
4d20: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
4d30: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
4d40: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
4d50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4d60: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
4d70: 2c 20 72 63 2c 20 22 64 61 74 61 62 61 73 65 20  , rc, "database 
4d80: 73 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64  schema is locked
4d90: 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 20  : %s", zDb);.   
4da0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
4db0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4dc0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 20 29  E_ReadUncommit )
4dd0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
4de0: 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20  nd_prepare;.    
4df0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4e00: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
4e10: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 73  ckList(db);..  s
4e20: 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20  Parse.db = db;. 
4e30: 20 69 66 28 20 6e 42 79 74 65 73 3e 3d 30 20 26   if( nBytes>=0 &
4e40: 26 20 28 6e 42 79 74 65 73 3d 3d 30 20 7c 7c 20  & (nBytes==0 || 
4e50: 7a 53 71 6c 5b 6e 42 79 74 65 73 2d 31 5d 21 3d  zSql[nBytes-1]!=
4e60: 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  0) ){.    char *
4e70: 7a 53 71 6c 43 6f 70 79 3b 0a 20 20 20 20 69 6e  zSqlCopy;.    in
4e80: 74 20 6d 78 4c 65 6e 20 3d 20 64 62 2d 3e 61 4c  t mxLen = db->aL
4e90: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4ea0: 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3b 0a 20  T_SQL_LENGTH];. 
4eb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79     testcase( nBy
4ec0: 74 65 73 3d 3d 6d 78 4c 65 6e 20 29 3b 0a 20 20  tes==mxLen );.  
4ed0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74    testcase( nByt
4ee0: 65 73 3d 3d 6d 78 4c 65 6e 2b 31 20 29 3b 0a 20  es==mxLen+1 );. 
4ef0: 20 20 20 69 66 28 20 6e 42 79 74 65 73 3e 6d 78     if( nBytes>mx
4f00: 4c 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Len ){.      sql
4f10: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
4f20: 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42  (db, SQLITE_TOOB
4f30: 49 47 2c 20 22 73 74 61 74 65 6d 65 6e 74 20 74  IG, "statement t
4f40: 6f 6f 20 6c 6f 6e 67 22 29 3b 0a 20 20 20 20 20  oo long");.     
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
4f60: 45 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  Exit(db, SQLITE_
4f70: 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20 20 67  TOOBIG);.      g
4f80: 6f 74 6f 20 65 6e 64 5f 70 72 65 70 61 72 65 3b  oto end_prepare;
4f90: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 43  .    }.    zSqlC
4fa0: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53  opy = sqlite3DbS
4fb0: 74 72 4e 44 75 70 28 64 62 2c 20 7a 53 71 6c 2c  trNDup(db, zSql,
4fc0: 20 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69 66   nBytes);.    if
4fd0: 28 20 7a 53 71 6c 43 6f 70 79 20 29 7b 0a 20 20  ( zSqlCopy ){.  
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61      sqlite3RunPa
4ff0: 72 73 65 72 28 26 73 50 61 72 73 65 2c 20 7a 53  rser(&sParse, zS
5000: 71 6c 43 6f 70 79 2c 20 26 7a 45 72 72 4d 73 67  qlCopy, &zErrMsg
5010: 29 3b 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e  );.      sParse.
5020: 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 73 50  zTail = &zSql[sP
5030: 61 72 73 65 2e 7a 54 61 69 6c 2d 7a 53 71 6c 43  arse.zTail-zSqlC
5040: 6f 70 79 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  opy];.      sqli
5050: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
5060: 71 6c 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c  qlCopy);.    }el
5070: 73 65 7b 0a 20 20 20 20 20 20 73 50 61 72 73 65  se{.      sParse
5080: 2e 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 6e  .zTail = &zSql[n
5090: 42 79 74 65 73 5d 3b 0a 20 20 20 20 7d 0a 20 20  Bytes];.    }.  
50a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
50b0: 65 33 52 75 6e 50 61 72 73 65 72 28 26 73 50 61  e3RunParser(&sPa
50c0: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
50d0: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Msg);.  }.  asse
50e0: 72 74 28 20 30 3d 3d 73 50 61 72 73 65 2e 6e 51  rt( 0==sParse.nQ
50f0: 75 65 72 79 4c 6f 6f 70 20 29 3b 0a 0a 20 20 69  ueryLoop );..  i
5100: 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51  f( sParse.rc==SQ
5110: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 73 50 61 72  LITE_DONE ) sPar
5120: 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  se.rc = SQLITE_O
5130: 4b 3b 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e  K;.  if( sParse.
5140: 63 68 65 63 6b 53 63 68 65 6d 61 20 29 7b 0a 20  checkSchema ){. 
5150: 20 20 20 73 63 68 65 6d 61 49 73 56 61 6c 69 64     schemaIsValid
5160: 28 26 73 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  (&sParse);.  }. 
5170: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
5180: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 50 61  ailed ){.    sPa
5190: 72 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f  rse.rc = SQLITE_
51a0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
51b0: 20 20 69 66 28 20 70 7a 54 61 69 6c 20 29 7b 0a    if( pzTail ){.
51c0: 20 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20 73 50      *pzTail = sP
51d0: 61 72 73 65 2e 7a 54 61 69 6c 3b 0a 20 20 7d 0a  arse.zTail;.  }.
51e0: 20 20 72 63 20 3d 20 73 50 61 72 73 65 2e 72 63    rc = sParse.rc
51f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
5200: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
5210: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5220: 4f 4b 20 26 26 20 73 50 61 72 73 65 2e 70 56 64  OK && sParse.pVd
5230: 62 65 20 26 26 20 73 50 61 72 73 65 2e 65 78 70  be && sParse.exp
5240: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 74 61 74  lain ){.    stat
5250: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
5260: 63 6f 6e 73 74 20 61 7a 43 6f 6c 4e 61 6d 65 5b  const azColName[
5270: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 22 61 64  ] = {.       "ad
5280: 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22  dr", "opcode", "
5290: 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c  p1", "p2", "p3",
52a0: 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f   "p4", "p5", "co
52b0: 6d 6d 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 22  mment",.       "
52c0: 69 64 22 2c 20 22 70 61 72 65 6e 74 22 2c 20 22  id", "parent", "
52d0: 6e 6f 74 75 73 65 64 22 2c 20 22 64 65 74 61 69  notused", "detai
52e0: 6c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  l".    };.    in
52f0: 74 20 69 46 69 72 73 74 2c 20 6d 78 3b 0a 20 20  t iFirst, mx;.  
5300: 20 20 69 66 28 20 73 50 61 72 73 65 2e 65 78 70    if( sParse.exp
5310: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
5320: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
5330: 75 6d 43 6f 6c 73 28 73 50 61 72 73 65 2e 70 56  umCols(sParse.pV
5340: 64 62 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  dbe, 4);.      i
5350: 46 69 72 73 74 20 3d 20 38 3b 0a 20 20 20 20 20  First = 8;.     
5360: 20 6d 78 20 3d 20 31 32 3b 0a 20 20 20 20 7d 65   mx = 12;.    }e
5370: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5380: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
5390: 28 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20 38  (sParse.pVdbe, 8
53a0: 29 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74 20  );.      iFirst 
53b0: 3d 20 30 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20  = 0;.      mx = 
53c0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  8;.    }.    for
53d0: 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 6d 78 3b  (i=iFirst; i<mx;
53e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
53f0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
5400: 6d 65 28 73 50 61 72 73 65 2e 70 56 64 62 65 2c  me(sParse.pVdbe,
5410: 20 69 2d 69 46 69 72 73 74 2c 20 43 4f 4c 4e 41   i-iFirst, COLNA
5420: 4d 45 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20  ME_NAME,.       
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 20 20 61 7a 43 6f 6c 4e 61 6d 65 5b 69       azColName[i
5450: 5d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ], SQLITE_STATIC
5460: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
5470: 64 69 66 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69  dif..  if( db->i
5480: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
5490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
54a0: 74 53 71 6c 28 73 50 61 72 73 65 2e 70 56 64 62  tSql(sParse.pVdb
54b0: 65 2c 20 7a 53 71 6c 2c 20 28 69 6e 74 29 28 73  e, zSql, (int)(s
54c0: 50 61 72 73 65 2e 7a 54 61 69 6c 2d 7a 53 71 6c  Parse.zTail-zSql
54d0: 29 2c 20 70 72 65 70 46 6c 61 67 73 29 3b 0a 20  ), prepFlags);. 
54e0: 20 7d 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e   }.  if( sParse.
54f0: 70 56 64 62 65 20 26 26 20 28 72 63 21 3d 53 51  pVdbe && (rc!=SQ
5500: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e 6d  LITE_OK || db->m
5510: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
5520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
5530: 69 6e 61 6c 69 7a 65 28 73 50 61 72 73 65 2e 70  inalize(sParse.p
5540: 56 64 62 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Vdbe);.    asser
5550: 74 28 21 28 2a 70 70 53 74 6d 74 29 29 3b 0a 20  t(!(*ppStmt));. 
5560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 53   }else{.    *ppS
5570: 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73  tmt = (sqlite3_s
5580: 74 6d 74 2a 29 73 50 61 72 73 65 2e 70 56 64 62  tmt*)sParse.pVdb
5590: 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 45  e;.  }..  if( zE
55a0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c  rrMsg ){.    sql
55b0: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
55c0: 28 64 62 2c 20 72 63 2c 20 22 25 73 22 2c 20 7a  (db, rc, "%s", z
55d0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
55e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
55f0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65  ErrMsg);.  }else
5600: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5610: 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
5620: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
5630: 20 54 72 69 67 67 65 72 50 72 67 20 73 74 72 75   TriggerPrg stru
5640: 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
5650: 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 74   while parsing t
5660: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  his statement. *
5670: 2f 0a 20 20 77 68 69 6c 65 28 20 73 50 61 72 73  /.  while( sPars
5680: 65 2e 70 54 72 69 67 67 65 72 50 72 67 20 29 7b  e.pTriggerPrg ){
5690: 0a 20 20 20 20 54 72 69 67 67 65 72 50 72 67 20  .    TriggerPrg 
56a0: 2a 70 54 20 3d 20 73 50 61 72 73 65 2e 70 54 72  *pT = sParse.pTr
56b0: 69 67 67 65 72 50 72 67 3b 0a 20 20 20 20 73 50  iggerPrg;.    sP
56c0: 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72 67  arse.pTriggerPrg
56d0: 20 3d 20 70 54 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pT->pNext;.  
56e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
56f0: 64 62 2c 20 70 54 29 3b 0a 20 20 7d 0a 0a 65 6e  db, pT);.  }..en
5700: 64 5f 70 72 65 70 61 72 65 3a 0a 0a 20 20 73 71  d_prepare:..  sq
5710: 6c 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74  lite3ParserReset
5720: 28 26 73 50 61 72 73 65 29 3b 0a 20 20 72 65 74  (&sParse);.  ret
5730: 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
5740: 20 69 6e 74 20 73 71 6c 69 74 65 33 4c 6f 63 6b   int sqlite3Lock
5750: 41 6e 64 50 72 65 70 61 72 65 28 0a 20 20 73 71  AndPrepare(.  sq
5760: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
5770: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5780: 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20  ase handle. */. 
5790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
57a0: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54  l,         /* UT
57b0: 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20  F-8 encoded SQL 
57c0: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
57d0: 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20  int nBytes,     
57e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
57f0: 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62  gth of zSql in b
5800: 79 74 65 73 2e 20 2a 2f 0a 20 20 75 33 32 20 70  ytes. */.  u32 p
5810: 72 65 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20  repFlags,       
5820: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
5830: 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50  more SQLITE_PREP
5840: 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20  ARE_* flags */. 
5850: 20 56 64 62 65 20 2a 70 4f 6c 64 2c 20 20 20 20   Vdbe *pOld,    
5860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d             /* VM
5870: 20 62 65 69 6e 67 20 72 65 70 72 65 70 61 72 65   being reprepare
5880: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  d */.  sqlite3_s
5890: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
58a0: 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74   /* OUT: A point
58b0: 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  er to the prepar
58c0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
58d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
58e0: 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f  zTail       /* O
58f0: 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65  UT: End of parse
5900: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
5910: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 63   int rc;.  int c
5920: 6e 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  nt = 0;..#ifdef 
5930: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
5940: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
5950: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
5960: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
5970: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70  KPT;.#endif.  *p
5980: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
5990: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
59a0: 68 65 63 6b 4f 6b 28 64 62 29 7c 7c 7a 53 71 6c  heckOk(db)||zSql
59b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
59c0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
59d0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
59e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
59f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
5a00: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
5a10: 6c 6c 28 64 62 29 3b 0a 20 20 64 6f 7b 0a 20 20  ll(db);.  do{.  
5a20: 20 20 2f 2a 20 4d 61 6b 65 20 6d 75 6c 74 69 70    /* Make multip
5a30: 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  le attempts to c
5a40: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 2c 20  ompile the SQL, 
5a50: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
5a60: 73 75 63 63 65 65 64 73 0a 20 20 20 20 2a 2a 20  succeeds.    ** 
5a70: 6f 72 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20  or encounters a 
5a80: 70 65 72 6d 61 6e 65 6e 74 20 65 72 72 6f 72 2e  permanent error.
5a90: 20 20 41 20 73 63 68 65 6d 61 20 70 72 6f 62 6c    A schema probl
5aa0: 65 6d 20 61 66 74 65 72 20 6f 6e 65 20 73 63 68  em after one sch
5ab0: 65 6d 61 0a 20 20 20 20 2a 2a 20 72 65 73 65 74  ema.    ** reset
5ac0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
5ad0: 20 70 65 72 6d 61 6e 65 6e 74 20 65 72 72 6f 72   permanent error
5ae0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
5af0: 6c 69 74 65 33 50 72 65 70 61 72 65 28 64 62 2c  lite3Prepare(db,
5b00: 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 70   zSql, nBytes, p
5b10: 72 65 70 46 6c 61 67 73 2c 20 70 4f 6c 64 2c 20  repFlags, pOld, 
5b20: 70 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c 29 3b  ppStmt, pzTail);
5b30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
5b40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a 70  =SQLITE_OK || *p
5b50: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 7d 77  pStmt==0 );.  }w
5b60: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
5b70: 5f 45 52 52 4f 52 5f 52 45 54 52 59 0a 20 20 20  _ERROR_RETRY.   
5b80: 20 20 20 20 7c 7c 20 28 72 63 3d 3d 53 51 4c 49      || (rc==SQLI
5b90: 54 45 5f 53 43 48 45 4d 41 20 26 26 20 28 73 71  TE_SCHEMA && (sq
5ba0: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
5bb0: 65 6d 61 28 64 62 2c 2d 31 29 2c 20 63 6e 74 2b  ema(db,-1), cnt+
5bc0: 2b 29 3d 3d 30 29 20 29 3b 0a 20 20 73 71 6c 69  +)==0) );.  sqli
5bd0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
5be0: 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
5bf0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
5c00: 72 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  rc);.  assert( (
5c10: 72 63 26 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  rc&db->errMask)=
5c20: 3d 72 63 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  =rc );.  sqlite3
5c30: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
5c40: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
5c50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5c60: 65 72 75 6e 20 74 68 65 20 63 6f 6d 70 69 6c 61  erun the compila
5c70: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 65 6d  tion of a statem
5c80: 65 6e 74 20 61 66 74 65 72 20 61 20 73 63 68 65  ent after a sche
5c90: 6d 61 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a  ma change..**.**
5ca0: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
5cb0: 74 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  t is successfull
5cc0: 79 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20 72 65  y recompiled, re
5cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
5ce0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66  Otherwise,.** if
5cf0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
5d00: 61 6e 6e 6f 74 20 62 65 20 72 65 63 6f 6d 70 69  annot be recompi
5d10: 6c 65 64 20 62 65 63 61 75 73 65 20 61 6e 6f 74  led because anot
5d20: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
5d30: 61 73 0a 2a 2a 20 6c 6f 63 6b 65 64 20 74 68 65  as.** locked the
5d40: 20 73 71 6c 69 74 65 33 5f 6d 61 73 74 65 72 20   sqlite3_master 
5d50: 74 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 53 51  table, return SQ
5d60: 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 20 49 66 20  LITE_LOCKED. If 
5d70: 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  any other error.
5d80: 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
5d90: 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e  n SQLITE_SCHEMA.
5da0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
5db0: 65 70 72 65 70 61 72 65 28 56 64 62 65 20 2a 70  eprepare(Vdbe *p
5dc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
5dd0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65  qlite3_stmt *pNe
5de0: 77 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  w;.  const char 
5df0: 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *zSql;.  sqlite3
5e00: 20 2a 64 62 3b 0a 20 20 75 38 20 70 72 65 70 46   *db;.  u8 prepF
5e10: 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  lags;..  assert(
5e20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5e30: 65 6c 64 28 73 71 6c 69 74 65 33 56 64 62 65 44  eld(sqlite3VdbeD
5e40: 62 28 70 29 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  b(p)->mutex) );.
5e50: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5e60: 5f 73 71 6c 28 28 73 71 6c 69 74 65 33 5f 73 74  _sql((sqlite3_st
5e70: 6d 74 20 2a 29 70 29 3b 0a 20 20 61 73 73 65 72  mt *)p);.  asser
5e80: 74 28 20 7a 53 71 6c 21 3d 30 20 29 3b 20 20 2f  t( zSql!=0 );  /
5e90: 2a 20 52 65 70 72 65 70 61 72 65 20 6f 6e 6c 79  * Reprepare only
5ea0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 72 65 70   called for prep
5eb0: 61 72 65 5f 76 32 28 29 20 73 74 61 74 65 6d 65  are_v2() stateme
5ec0: 6e 74 73 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  nts */.  db = sq
5ed0: 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 3b 0a  lite3VdbeDb(p);.
5ee0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5ef0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
5f00: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 72 65  >mutex) );.  pre
5f10: 70 46 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pFlags = sqlite3
5f20: 56 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73  VdbePrepareFlags
5f30: 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
5f40: 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72  te3LockAndPrepar
5f50: 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  e(db, zSql, -1, 
5f60: 70 72 65 70 46 6c 61 67 73 2c 20 70 2c 20 26 70  prepFlags, p, &p
5f70: 4e 65 77 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  New, 0);.  if( r
5f80: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  c ){.    if( rc=
5f90: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
5fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
5fb0: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
5fc0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  }.    assert( pN
5fd0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ew==0 );.    ret
5fe0: 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  urn rc;.  }else{
5ff0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
6000: 77 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71  w!=0 );.  }.  sq
6010: 6c 69 74 65 33 56 64 62 65 53 77 61 70 28 28 56  lite3VdbeSwap((V
6020: 64 62 65 2a 29 70 4e 65 77 2c 20 70 29 3b 0a 20  dbe*)pNew, p);. 
6030: 20 73 71 6c 69 74 65 33 54 72 61 6e 73 66 65 72   sqlite3Transfer
6040: 42 69 6e 64 69 6e 67 73 28 70 4e 65 77 2c 20 28  Bindings(pNew, (
6050: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29  sqlite3_stmt*)p)
6060: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
6070: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 28  esetStepResult((
6080: 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20 73  Vdbe*)pNew);.  s
6090: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
60a0: 7a 65 28 28 56 64 62 65 2a 29 70 4e 65 77 29 3b  ze((Vdbe*)pNew);
60b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
60c0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
60d0: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
60e0: 68 65 20 6f 66 66 69 63 69 61 6c 20 41 50 49 2e  he official API.
60f0: 20 20 4c 65 67 61 63 79 20 61 6e 64 20 6e 65 77    Legacy and new
6100: 20 75 73 65 2e 20 20 49 6e 20 74 68 65 20 6c 65   use.  In the le
6110: 67 61 63 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c  gacy.** version,
6120: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
6130: 4c 20 74 65 78 74 20 69 73 20 6e 6f 74 20 73 61  L text is not sa
6140: 76 65 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ved in the prepa
6150: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  red statement.**
6160: 20 61 6e 64 20 73 6f 20 69 66 20 61 20 73 63 68   and so if a sch
6170: 65 6d 61 20 63 68 61 6e 67 65 20 6f 63 63 75 72  ema change occur
6180: 73 2c 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  s, SQLITE_SCHEMA
6190: 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 0a   is returned by.
61a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ** sqlite3_step(
61b0: 29 2e 20 20 49 6e 20 74 68 65 20 6e 65 77 20 76  ).  In the new v
61c0: 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67  ersion, the orig
61d0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73  inal SQL text is
61e0: 20 72 65 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64   retained.** and
61f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
6200: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
6210: 72 65 63 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e  recompiled if an
6220: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a   schema change.*
6230: 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
6240: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6250: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6270: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
6280: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
6290: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
62a0: 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   /* UTF-8 encode
62b0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
62c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   */.  int nBytes
62d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
62e0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
62f0: 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20  l in bytes. */. 
6300: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6310: 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55  ppStmt,    /* OU
6320: 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  T: A pointer to 
6330: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
6340: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
6350: 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20  t char **pzTail 
6360: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e        /* OUT: En
6370: 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69  d of parsed stri
6380: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
6390: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
63a0: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28  3LockAndPrepare(
63b0: 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 30  db,zSql,nBytes,0
63c0: 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c  ,0,ppStmt,pzTail
63d0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
63e0: 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20  _ENABLE_SQLRR.  
63f0: 53 52 52 65 63 50 72 65 70 61 72 65 28 64 62 2c  SRRecPrepare(db,
6400: 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 30   zSql, nBytes, 0
6410: 2c 20 2a 70 70 53 74 6d 74 29 3b 0a 23 65 6e 64  , *ppStmt);.#end
6420: 69 66 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  if.  assert( rc=
6430: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70  =SQLITE_OK || pp
6440: 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74  Stmt==0 || *ppSt
6450: 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52  mt==0 );  /* VER
6460: 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20  IFY: F13021 */. 
6470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
6480: 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  t sqlite3_prepar
6490: 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  e_v2(.  sqlite3 
64a0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
64b0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
64c0: 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ndle. */.  const
64d0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
64e0: 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e       /* UTF-8 en
64f0: 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d  coded SQL statem
6500: 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ent. */.  int nB
6510: 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  ytes,           
6520: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6530: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20   zSql in bytes. 
6540: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
6550: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f  t **ppStmt,    /
6560: 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72  * OUT: A pointer
6570: 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   to the prepared
6580: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54  const char **pzT
65a0: 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ail       /* OUT
65b0: 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20  : End of parsed 
65c0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
65d0: 6e 74 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44  nt rc;.  /* EVID
65e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 32 33  ENCE-OF: R-37923
65f0: 2d 31 32 31 37 33 20 54 68 65 20 73 71 6c 69 74  -12173 The sqlit
6600: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
6610: 69 6e 74 65 72 66 61 63 65 20 77 6f 72 6b 73 0a  interface works.
6620: 20 20 2a 2a 20 65 78 61 63 74 6c 79 20 74 68 65    ** exactly the
6630: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
6640: 5f 70 72 65 70 61 72 65 5f 76 33 28 29 20 77 69  _prepare_v3() wi
6650: 74 68 20 61 20 7a 65 72 6f 20 70 72 65 70 46 6c  th a zero prepFl
6660: 61 67 73 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ags.  ** paramet
6670: 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72  er..  **.  ** Pr
6680: 6f 6f 66 20 69 6e 20 74 68 61 74 20 74 68 65 20  oof in that the 
6690: 35 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f  5th parameter to
66a0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50   sqlite3LockAndP
66b0: 72 65 70 61 72 65 20 69 73 20 30 20 2a 2f 0a 20  repare is 0 */. 
66c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63   rc = sqlite3Loc
66d0: 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a  kAndPrepare(db,z
66e0: 53 71 6c 2c 6e 42 79 74 65 73 2c 53 51 4c 49 54  Sql,nBytes,SQLIT
66f0: 45 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51  E_PREPARE_SAVESQ
6700: 4c 2c 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  L,0,.           
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29    ppStmt,pzTail)
6730: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
6740: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53  SQLITE_OK || ppS
6750: 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d  tmt==0 || *ppStm
6760: 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
6770: 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
6780: 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20  e3_prepare_v3(. 
6790: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
67a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
67b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
67c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
67d0: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  zSql,         /*
67e0: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53   UTF-8 encoded S
67f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  QL statement. */
6800: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20  .  int nBytes,  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6820: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
6830: 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 6e  n bytes. */.  un
6840: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46  signed int prepF
6850: 6c 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72 6f 20  lags,   /* Zero 
6860: 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50  or more SQLITE_P
6870: 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a  REPARE_* flags *
6880: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
6890: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
68a0: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
68b0: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
68c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
68d0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
68e0: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
68f0: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
6900: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
6910: 74 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45  t rc;.  /* EVIDE
6920: 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 38 36 31 2d  NCE-OF: R-56861-
6930: 34 32 36 37 33 20 73 71 6c 69 74 65 33 5f 70 72  42673 sqlite3_pr
6940: 65 70 61 72 65 5f 76 33 28 29 20 64 69 66 66 65  epare_v3() diffe
6950: 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  rs from.  ** sql
6960: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
6970: 29 20 6f 6e 6c 79 20 69 6e 20 68 61 76 69 6e 67  ) only in having
6980: 20 74 68 65 20 65 78 74 72 61 20 70 72 65 70 46   the extra prepF
6990: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2c 0a  lags parameter,.
69a0: 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20    ** which is a 
69b0: 62 69 74 20 61 72 72 61 79 20 63 6f 6e 73 69 73  bit array consis
69c0: 74 69 6e 67 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ting of zero or 
69d0: 6d 6f 72 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  more of the.  **
69e0: 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f   SQLITE_PREPARE_
69f0: 2a 20 66 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  * flags..  **.  
6a00: 2a 2a 20 50 72 6f 6f 66 20 62 79 20 63 6f 6d 70  ** Proof by comp
6a10: 61 72 69 73 6f 6e 20 74 6f 20 74 68 65 20 69 6d  arison to the im
6a20: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
6a30: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
6a40: 76 32 28 29 0a 20 20 2a 2a 20 64 69 72 65 63 74  v2().  ** direct
6a50: 6c 79 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 72  ly above. */.  r
6a60: 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41  c = sqlite3LockA
6a70: 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53 71  ndPrepare(db,zSq
6a80: 6c 2c 6e 42 79 74 65 73 2c 0a 20 20 20 20 20 20  l,nBytes,.      
6a90: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
6aa0: 45 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51  E_PREPARE_SAVESQ
6ab0: 4c 7c 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c  L|(prepFlags&SQL
6ac0: 49 54 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b  ITE_PREPARE_MASK
6ad0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6ae0: 20 20 20 20 30 2c 70 70 53 74 6d 74 2c 70 7a 54      0,ppStmt,pzT
6af0: 61 69 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ail);.#ifdef SQL
6b00: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52  ITE_ENABLE_SQLRR
6b10: 0a 20 20 53 52 52 65 63 50 72 65 70 61 72 65 28  .  SRRecPrepare(
6b20: 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73  db, zSql, nBytes
6b30: 2c 20 31 2c 20 2a 70 70 53 74 6d 74 29 3b 0a 23  , 1, *ppStmt);.#
6b40: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
6b50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
6b60: 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70   ppStmt==0 || *p
6b70: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 72 65  pStmt==0 );.  re
6b80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66  turn rc;.}...#if
6b90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6ba0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 43 6f 6d  _UTF16./*.** Com
6bb0: 70 69 6c 65 20 74 68 65 20 55 54 46 2d 31 36 20  pile the UTF-16 
6bc0: 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74  encoded SQL stat
6bd0: 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f 20  ement zSql into 
6be0: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
6bf0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
6c00: 74 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  t sqlite3Prepare
6c10: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
6c20: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
6c30: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
6c40: 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20  le. */ .  const 
6c50: 76 6f 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20  void *zSql,     
6c60: 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e      /* UTF-16 en
6c70: 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d  coded SQL statem
6c80: 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ent. */.  int nB
6c90: 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  ytes,           
6ca0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6cb0: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20   zSql in bytes. 
6cc0: 2a 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61  */.  u32 prepFla
6cd0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
6ce0: 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53  * Zero or more S
6cf0: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20  QLITE_PREPARE_* 
6d00: 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
6d10: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
6d20: 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70  ,    /* OUT: A p
6d30: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
6d40: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6d50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6d60: 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20   **pzTail       
6d70: 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70  /* OUT: End of p
6d80: 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  arsed string */.
6d90: 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ){.  /* This fun
6da0: 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
6db0: 77 6f 72 6b 73 20 62 79 20 66 69 72 73 74 20 74  works by first t
6dc0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
6dd0: 55 54 46 2d 31 36 0a 20 20 2a 2a 20 65 6e 63 6f  UTF-16.  ** enco
6de0: 64 65 64 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ded string to UT
6df0: 46 2d 38 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 69  F-8, then invoki
6e00: 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ng sqlite3_prepa
6e10: 72 65 28 29 2e 20 54 68 65 0a 20 20 2a 2a 20 74  re(). The.  ** t
6e20: 72 69 63 6b 79 20 62 69 74 20 69 73 20 66 69 67  ricky bit is fig
6e30: 75 72 69 6e 67 20 6f 75 74 20 74 68 65 20 70 6f  uring out the po
6e40: 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
6e50: 69 6e 20 2a 70 7a 54 61 69 6c 2e 0a 20 20 2a 2f  in *pzTail..  */
6e60: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 38 3b 0a  .  char *zSql8;.
6e70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6e80: 61 69 6c 38 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ail8 = 0;.  int 
6e90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6ea0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6eb0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6ec0: 20 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30 20    if( ppStmt==0 
6ed0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6ee0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6ef0: 64 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  dif.  *ppStmt = 
6f00: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
6f10: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
6f20: 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  b)||zSql==0 ){. 
6f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6f40: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6f50: 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3e 3d  }.  if( nBytes>=
6f60: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  0 ){.    int sz;
6f70: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6f80: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
6f90: 2a 29 7a 53 71 6c 3b 0a 20 20 20 20 66 6f 72 28  *)zSql;.    for(
6fa0: 73 7a 3d 30 3b 20 73 7a 3c 6e 42 79 74 65 73 20  sz=0; sz<nBytes 
6fb0: 26 26 20 28 7a 5b 73 7a 5d 21 3d 30 20 7c 7c 20  && (z[sz]!=0 || 
6fc0: 7a 5b 73 7a 2b 31 5d 21 3d 30 29 3b 20 73 7a 20  z[sz+1]!=0); sz 
6fd0: 2b 3d 20 32 29 7b 7d 0a 20 20 20 20 6e 42 79 74  += 2){}.    nByt
6fe0: 65 73 20 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 73  es = sz;.  }.  s
6ff0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7000: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7010: 20 7a 53 71 6c 38 20 3d 20 73 71 6c 69 74 65 33   zSql8 = sqlite3
7020: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 53 71  Utf16to8(db, zSq
7030: 6c 2c 20 6e 42 79 74 65 73 2c 20 53 51 4c 49 54  l, nBytes, SQLIT
7040: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
7050: 20 20 69 66 28 20 7a 53 71 6c 38 20 29 7b 0a 20    if( zSql8 ){. 
7060: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c     rc = sqlite3L
7070: 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62  ockAndPrepare(db
7080: 2c 20 7a 53 71 6c 38 2c 20 2d 31 2c 20 70 72 65  , zSql8, -1, pre
7090: 70 46 6c 61 67 73 2c 20 30 2c 20 70 70 53 74 6d  pFlags, 0, ppStm
70a0: 74 2c 20 26 7a 54 61 69 6c 38 29 3b 0a 20 20 7d  t, &zTail8);.  }
70b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
70c0: 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52  NABLE_SQLRR.  SR
70d0: 52 65 63 50 72 65 70 61 72 65 28 64 62 2c 20 7a  RecPrepare(db, z
70e0: 53 71 6c 38 2c 20 2d 31 2c 20 31 2c 20 2a 70 70  Sql8, -1, 1, *pp
70f0: 53 74 6d 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Stmt);.#endif.  
7100: 69 66 28 20 7a 54 61 69 6c 38 20 26 26 20 70 7a  if( zTail8 && pz
7110: 54 61 69 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Tail ){.    /* I
7120: 66 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  f sqlite3_prepar
7130: 65 20 72 65 74 75 72 6e 73 20 61 20 74 61 69 6c  e returns a tail
7140: 20 70 6f 69 6e 74 65 72 2c 20 77 65 20 63 61 6c   pointer, we cal
7150: 63 75 6c 61 74 65 20 74 68 65 0a 20 20 20 20 2a  culate the.    *
7160: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 69  * equivalent poi
7170: 6e 74 65 72 20 69 6e 74 6f 20 74 68 65 20 55 54  nter into the UT
7180: 46 2d 31 36 20 73 74 72 69 6e 67 20 62 79 20 63  F-16 string by c
7190: 6f 75 6e 74 69 6e 67 20 74 68 65 20 75 6e 69 63  ounting the unic
71a0: 6f 64 65 0a 20 20 20 20 2a 2a 20 63 68 61 72 61  ode.    ** chara
71b0: 63 74 65 72 73 20 62 65 74 77 65 65 6e 20 7a 53  cters between zS
71c0: 71 6c 38 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20  ql8 and zTail8, 
71d0: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 69  and then returni
71e0: 6e 67 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20  ng a pointer.   
71f0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e 75 6d   ** the same num
7200: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
7210: 73 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31  s into the UTF-1
7220: 36 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f  6 string..    */
7230: 0a 20 20 20 20 69 6e 74 20 63 68 61 72 73 5f 70  .    int chars_p
7240: 61 72 73 65 64 20 3d 20 73 71 6c 69 74 65 33 55  arsed = sqlite3U
7250: 74 66 38 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38  tf8CharLen(zSql8
7260: 2c 20 28 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a  , (int)(zTail8-z
7270: 53 71 6c 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54  Sql8));.    *pzT
7280: 61 69 6c 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c  ail = (u8 *)zSql
7290: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 31 36 42   + sqlite3Utf16B
72a0: 79 74 65 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61  yteLen(zSql, cha
72b0: 72 73 5f 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a  rs_parsed);.  }.
72c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
72d0: 64 62 2c 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72  db, zSql8); .  r
72e0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
72f0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
7300: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7310: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7320: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7330: 0a 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73  .** Two versions
7340: 20 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c   of the official
7350: 20 41 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e   API.  Legacy an
7360: 64 20 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74  d new use.  In t
7370: 68 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72  he legacy.** ver
7380: 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e  sion, the origin
7390: 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e  al SQL text is n
73a0: 6f 74 20 73 61 76 65 64 20 69 6e 20 74 68 65 20  ot saved in the 
73b0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
73c0: 6e 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20  nt.** and so if 
73d0: 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20  a schema change 
73e0: 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53  occurs, SQLITE_S
73f0: 43 48 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65  CHEMA is returne
7400: 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  d by.** sqlite3_
7410: 73 74 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20  step().  In the 
7420: 6e 65 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65  new version, the
7430: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65   original SQL te
7440: 78 74 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a  xt is retained.*
7450: 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d  * and the statem
7460: 65 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ent is automatic
7470: 61 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20  ally recompiled 
7480: 69 66 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61  if an schema cha
7490: 6e 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  nge.** occurs..*
74a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72  /.int sqlite3_pr
74b0: 65 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74  epare16(.  sqlit
74c0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
74d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
74e0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63   handle. */ .  c
74f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c  onst void *zSql,
7500: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
7510: 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  16 encoded SQL s
7520: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
7530: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
7540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7550: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
7560: 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tes. */.  sqlite
7570: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
7580: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
7590: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
75a0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
75b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
75c0: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
75d0: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
75e0: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
75f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
7600: 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72   = sqlite3Prepar
7610: 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  e16(db,zSql,nByt
7620: 65 73 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61  es,0,ppStmt,pzTa
7630: 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  il);.  assert( r
7640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
7650: 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70  ppStmt==0 || *pp
7660: 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56  Stmt==0 );  /* V
7670: 45 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f  ERIFY: F13021 */
7680: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7690: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70  int sqlite3_prep
76a0: 61 72 65 31 36 5f 76 32 28 0a 20 20 73 71 6c 69  are16_v2(.  sqli
76b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
76c0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
76d0: 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20  e handle. */ .  
76e0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
76f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46  ,         /* UTF
7700: 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20  -16 encoded SQL 
7710: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
7720: 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20  int nBytes,     
7730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
7740: 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62  gth of zSql in b
7750: 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ytes. */.  sqlit
7760: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
7770: 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70  ,    /* OUT: A p
7780: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
7790: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
77a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
77b0: 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20   **pzTail       
77c0: 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70  /* OUT: End of p
77d0: 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  arsed string */.
77e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
77f0: 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61  c = sqlite3Prepa
7800: 72 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79  re16(db,zSql,nBy
7810: 74 65 73 2c 53 51 4c 49 54 45 5f 50 52 45 50 41  tes,SQLITE_PREPA
7820: 52 45 5f 53 41 56 45 53 51 4c 2c 70 70 53 74 6d  RE_SAVESQL,ppStm
7830: 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73  t,pzTail);.  ass
7840: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
7850: 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20  OK || ppStmt==0 
7860: 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b  || *ppStmt==0 );
7870: 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33    /* VERIFY: F13
7880: 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  021 */.  return 
7890: 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
78a0: 33 5f 70 72 65 70 61 72 65 31 36 5f 76 33 28 0a  3_prepare16_v3(.
78b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
78d0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
78e0: 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  */ .  const void
78f0: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
7900: 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  /* UTF-16 encode
7910: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
7920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   */.  int nBytes
7930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7940: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
7950: 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20  l in bytes. */. 
7960: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72   unsigned int pr
7970: 65 70 46 6c 61 67 73 2c 20 20 20 2f 2a 20 5a 65  epFlags,   /* Ze
7980: 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54  ro or more SQLIT
7990: 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67  E_PREPARE_* flag
79a0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
79b0: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
79c0: 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74   /* OUT: A point
79d0: 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  er to the prepar
79e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
79f0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70    const void **p
7a00: 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f  zTail       /* O
7a10: 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65  UT: End of parse
7a20: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
7a30: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
7a40: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36  sqlite3Prepare16
7a50: 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c  (db,zSql,nBytes,
7a60: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
7a70: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
7a80: 7c 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49  |(prepFlags&SQLI
7a90: 54 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29  TE_PREPARE_MASK)
7aa0: 2c 0a 20 20 20 20 20 20 20 20 20 70 70 53 74 6d  ,.         ppStm
7ab0: 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73  t,pzTail);.  ass
7ac0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
7ad0: 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20  OK || ppStmt==0 
7ae0: 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b  || *ppStmt==0 );
7af0: 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33    /* VERIFY: F13
7b00: 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  021 */.  return 
7b10: 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
7b20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
7b30: 31 36 20 2a 2f 0a                                16 */.