/ Hex Artifact Content
Login

Artifact 82e5db1013846a819f198336fed72c44c974e7b1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4d 61 79 20 32  /*.** 2005 May 2
0010: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  5.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
0190: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
01a0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
01b0: 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  ().** interface,
01c0: 20 61 6e 64 20 72 6f 75 74 69 6e 65 73 20 74 68   and routines th
01d0: 61 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  at contribute to
01e0: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
01f0: 61 62 61 73 65 20 73 63 68 65 6d 61 0a 2a 2a 20  abase schema.** 
0200: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 23 69  from disk..*/.#i
0210: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0220: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  t.h"../*.** Fill
0230: 20 74 68 65 20 49 6e 69 74 44 61 74 61 20 73 74   the InitData st
0240: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6e 20  ructure with an 
0250: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 68  error message th
0260: 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  at indicates.** 
0270: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
0280: 65 20 69 73 20 63 6f 72 72 75 70 74 2e 0a 2a 2f  e is corrupt..*/
0290: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 72  .static void cor
02a0: 72 75 70 74 53 63 68 65 6d 61 28 0a 20 20 49 6e  ruptSchema(.  In
02b0: 69 74 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  itData *pData,  
02c0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61     /* Initializa
02d0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  tion context */.
02e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
02f0: 62 6a 2c 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74  bj,    /* Object
0300: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 74   being parsed at
0310: 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 65 72   the point of er
0320: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
0330: 68 61 72 20 2a 7a 45 78 74 72 61 20 20 20 2f 2a  har *zExtra   /*
0340: 20 45 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   Error informati
0350: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
0360: 65 33 20 2a 64 62 20 3d 20 70 44 61 74 61 2d 3e  e3 *db = pData->
0370: 64 62 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  db;.  if( !db->m
0380: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 28  allocFailed && (
0390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
03a0: 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
03b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
03c0: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 7a 4f 62 6a  *z;.    if( zObj
03d0: 3d 3d 30 20 29 20 7a 4f 62 6a 20 3d 20 22 3f 22  ==0 ) zObj = "?"
03e0: 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
03f0: 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f  3_mprintf("malfo
0400: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 73 63  rmed database sc
0410: 68 65 6d 61 20 28 25 73 29 22 2c 20 7a 4f 62 6a  hema (%s)", zObj
0420: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20  );.    if( z && 
0430: 7a 45 78 74 72 61 20 29 20 7a 20 3d 20 73 71 6c  zExtra ) z = sql
0440: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
0450: 20 2d 20 25 73 22 2c 20 7a 2c 20 7a 45 78 74 72   - %s", z, zExtr
0460: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  a);.    sqlite3D
0470: 62 46 72 65 65 28 64 62 2c 20 2a 70 44 61 74 61  bFree(db, *pData
0480: 2d 3e 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ->pzErrMsg);.   
0490: 20 2a 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d 73   *pData->pzErrMs
04a0: 67 20 3d 20 7a 3b 0a 20 20 20 20 69 66 28 20 7a  g = z;.    if( z
04b0: 3d 3d 30 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ==0 ) db->malloc
04c0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
04d0: 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 64 62    pData->rc = db
04e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3f  ->mallocFailed ?
04f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 3a 20   SQLITE_NOMEM : 
0500: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
0510: 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  KPT;.}../*.** Th
0520: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
0530: 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  ck routine for t
0540: 68 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69  he code that ini
0550: 74 69 61 6c 69 7a 65 73 20 74 68 65 0a 2a 2a 20  tializes the.** 
0560: 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 73  database.  See s
0570: 71 6c 69 74 65 33 49 6e 69 74 28 29 20 62 65 6c  qlite3Init() bel
0580: 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ow for additiona
0590: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
05a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
05b0: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 66 72  s also called fr
05c0: 6f 6d 20 74 68 65 20 4f 50 5f 50 61 72 73 65 53  om the OP_ParseS
05d0: 63 68 65 6d 61 20 6f 70 63 6f 64 65 20 6f 66 20  chema opcode of 
05e0: 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a 2a 20  the VDBE..**.** 
05f0: 45 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Each callback co
0600: 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f  ntains the follo
0610: 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  wing information
0620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76  :.**.**     argv
0630: 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68  [0] = name of th
0640: 69 6e 67 20 62 65 69 6e 67 20 63 72 65 61 74 65  ing being create
0650: 64 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d  d.**     argv[1]
0660: 20 3d 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d   = root page num
0670: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 6f 72  ber for table or
0680: 20 69 6e 64 65 78 2e 20 30 20 66 6f 72 20 74 72   index. 0 for tr
0690: 69 67 67 65 72 20 6f 72 20 76 69 65 77 2e 0a 2a  igger or view..*
06a0: 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20  *     argv[2] = 
06b0: 53 51 4c 20 74 65 78 74 20 66 6f 72 20 74 68 65  SQL text for the
06c0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
06d0: 74 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  t..**.*/.int sql
06e0: 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b  ite3InitCallback
06f0: 28 76 6f 69 64 20 2a 70 49 6e 69 74 2c 20 69 6e  (void *pInit, in
0700: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
0710: 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55  rgv, char **NotU
0720: 73 65 64 29 7b 0a 20 20 49 6e 69 74 44 61 74 61  sed){.  InitData
0730: 20 2a 70 44 61 74 61 20 3d 20 28 49 6e 69 74 44   *pData = (InitD
0740: 61 74 61 2a 29 70 49 6e 69 74 3b 0a 20 20 73 71  ata*)pInit;.  sq
0750: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 61 74  lite3 *db = pDat
0760: 61 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  a->db;.  int iDb
0770: 20 3d 20 70 44 61 74 61 2d 3e 69 44 62 3b 0a 0a   = pData->iDb;..
0780: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
0790: 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  3 );.  UNUSED_PA
07a0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
07b0: 2c 20 61 72 67 63 29 3b 0a 20 20 61 73 73 65 72  , argc);.  asser
07c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
07d0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
07e0: 20 29 3b 0a 20 20 44 62 43 6c 65 61 72 50 72 6f   );.  DbClearPro
07f0: 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44  perty(db, iDb, D
0800: 42 5f 45 6d 70 74 79 29 3b 0a 20 20 69 66 28 20  B_Empty);.  if( 
0810: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0820: 20 29 7b 0a 20 20 20 20 63 6f 72 72 75 70 74 53   ){.    corruptS
0830: 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67  chema(pData, arg
0840: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 72 65  v[0], 0);.    re
0850: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 61  turn 1;.  }..  a
0860: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
0870: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
0880: 20 20 69 66 28 20 61 72 67 76 3d 3d 30 20 29 20    if( argv==0 ) 
0890: 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4d  return 0;   /* M
08a0: 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 45  ight happen if E
08b0: 4d 50 54 59 5f 52 45 53 55 4c 54 5f 43 41 4c 4c  MPTY_RESULT_CALL
08c0: 42 41 43 4b 53 20 61 72 65 20 6f 6e 20 2a 2f 0a  BACKS are on */.
08d0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30    if( argv[1]==0
08e0: 20 29 7b 0a 20 20 20 20 63 6f 72 72 75 70 74 53   ){.    corruptS
08f0: 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67  chema(pData, arg
0900: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  v[0], 0);.  }els
0910: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74  e if( sqlite3_st
0920: 72 6e 69 63 6d 70 28 61 72 67 76 5b 32 5d 2c 22  rnicmp(argv[2],"
0930: 63 72 65 61 74 65 20 22 2c 37 29 3d 3d 30 20 29  create ",7)==0 )
0940: 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  {.    /* Call th
0950: 65 20 70 61 72 73 65 72 20 74 6f 20 70 72 6f 63  e parser to proc
0960: 65 73 73 20 61 20 43 52 45 41 54 45 20 54 41 42  ess a CREATE TAB
0970: 4c 45 2c 20 49 4e 44 45 58 20 6f 72 20 56 49 45  LE, INDEX or VIE
0980: 57 2e 0a 20 20 20 20 2a 2a 20 42 75 74 20 62 65  W..    ** But be
0990: 63 61 75 73 65 20 64 62 2d 3e 69 6e 69 74 2e 62  cause db->init.b
09a0: 75 73 79 20 69 73 20 73 65 74 20 74 6f 20 31 2c  usy is set to 1,
09b0: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 69 73   no VDBE code is
09c0: 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
09d0: 2a 20 6f 72 20 65 78 65 63 75 74 65 64 2e 20 20  * or executed.  
09e0: 41 6c 6c 20 74 68 65 20 70 61 72 73 65 72 20 64  All the parser d
09f0: 6f 65 73 20 69 73 20 62 75 69 6c 64 20 74 68 65  oes is build the
0a00: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 0a 20   internal data. 
0a10: 20 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 73     ** structures
0a20: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
0a30: 68 65 20 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  he table, index,
0a40: 20 6f 72 20 76 69 65 77 2e 0a 20 20 20 20 2a 2f   or view..    */
0a50: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
0a60: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0a70: 53 74 6d 74 3b 0a 20 20 20 20 54 45 53 54 4f 4e  Stmt;.    TESTON
0a80: 4c 59 28 69 6e 74 20 72 63 70 29 3b 20 20 20 20  LY(int rcp);    
0a90: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
0aa0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  n code from sqli
0ab0: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f  te3_prepare() */
0ac0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ..    assert( db
0ad0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
0ae0: 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20     db->init.iDb 
0af0: 3d 20 69 44 62 3b 0a 20 20 20 20 64 62 2d 3e 69  = iDb;.    db->i
0b00: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 73 71  nit.newTnum = sq
0b10: 6c 69 74 65 33 41 74 6f 69 28 61 72 67 76 5b 31  lite3Atoi(argv[1
0b20: 5d 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74  ]);.    db->init
0b30: 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d  .orphanTrigger =
0b40: 20 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59   0;.    TESTONLY
0b50: 28 72 63 70 20 3d 20 29 20 73 71 6c 69 74 65 33  (rcp = ) sqlite3
0b60: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 61 72 67  _prepare(db, arg
0b70: 76 5b 32 5d 2c 20 2d 31 2c 20 26 70 53 74 6d 74  v[2], -1, &pStmt
0b80: 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  , 0);.    rc = d
0b90: 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  b->errCode;.    
0ba0: 61 73 73 65 72 74 28 20 28 72 63 26 30 78 46 46  assert( (rc&0xFF
0bb0: 29 3d 3d 28 72 63 70 26 30 78 46 46 29 20 29 3b  )==(rcp&0xFF) );
0bc0: 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44  .    db->init.iD
0bd0: 62 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 53  b = 0;.    if( S
0be0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
0bf0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e        if( db->in
0c00: 69 74 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72  it.orphanTrigger
0c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
0c20: 72 74 28 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20  rt( iDb==1 );.  
0c30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0c40: 20 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 72     pData->rc = r
0c50: 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  c;.        if( r
0c60: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
0c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ){.          db-
0c80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
0c90: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
0ca0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
0cb0: 49 4e 54 45 52 52 55 50 54 20 26 26 20 28 72 63  INTERRUPT && (rc
0cc0: 26 30 78 46 46 29 21 3d 53 51 4c 49 54 45 5f 4c  &0xFF)!=SQLITE_L
0cd0: 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 20  OCKED ){.       
0ce0: 20 20 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61     corruptSchema
0cf0: 28 70 44 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c  (pData, argv[0],
0d00: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
0d10: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
0d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0d30: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
0d40: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c  ze(pStmt);.  }el
0d50: 73 65 20 69 66 28 20 61 72 67 76 5b 30 5d 3d 3d  se if( argv[0]==
0d60: 30 20 7c 7c 20 28 61 72 67 76 5b 32 5d 21 3d 30  0 || (argv[2]!=0
0d70: 20 26 26 20 61 72 67 76 5b 32 5d 5b 30 5d 21 3d   && argv[2][0]!=
0d80: 30 29 20 29 7b 0a 20 20 20 20 63 6f 72 72 75 70  0) ){.    corrup
0d90: 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61  tSchema(pData, a
0da0: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  rgv[0], 0);.  }e
0db0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
0dc0: 68 65 20 53 51 4c 20 63 6f 6c 75 6d 6e 20 69 73  he SQL column is
0dd0: 20 62 6c 61 6e 6b 20 69 74 20 6d 65 61 6e 73 20   blank it means 
0de0: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 64 65 78  this is an index
0df0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 77 61 73   that.    ** was
0e00: 20 63 72 65 61 74 65 64 20 74 6f 20 62 65 20 74   created to be t
0e10: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
0e20: 72 20 74 6f 20 66 75 6c 66 69 6c 6c 20 61 20 55  r to fulfill a U
0e30: 4e 49 51 55 45 0a 20 20 20 20 2a 2a 20 63 6f 6e  NIQUE.    ** con
0e40: 73 74 72 61 69 6e 74 20 66 6f 72 20 61 20 43 52  straint for a CR
0e50: 45 41 54 45 20 54 41 42 4c 45 2e 20 20 54 68 65  EATE TABLE.  The
0e60: 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 68 61   index should ha
0e70: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a  ve already.    *
0e80: 2a 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 77  * been created w
0e90: 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 65 64  hen we processed
0ea0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
0eb0: 45 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  E.  All we have.
0ec0: 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20 68 65 72      ** to do her
0ed0: 65 20 69 73 20 72 65 63 6f 72 64 20 74 68 65 20  e is record the 
0ee0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
0ef0: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
0f00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
0f10: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  x *pIndex;.    p
0f20: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
0f30: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 61 72 67  indIndex(db, arg
0f40: 76 5b 30 5d 2c 20 64 62 2d 3e 61 44 62 5b 69 44  v[0], db->aDb[iD
0f50: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b].zName);.    i
0f60: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
0f70: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
0f80: 6e 20 6f 63 63 75 72 20 69 66 20 74 68 65 72 65  n occur if there
0f90: 20 65 78 69 73 74 73 20 61 6e 20 69 6e 64 65 78   exists an index
0fa0: 20 6f 6e 20 61 20 54 45 4d 50 20 74 61 62 6c 65   on a TEMP table
0fb0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20   which.      ** 
0fc0: 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
0fd0: 65 20 61 73 20 61 6e 6f 74 68 65 72 20 69 6e 64  e as another ind
0fe0: 65 78 20 6f 6e 20 61 20 70 65 72 6d 61 6e 65 6e  ex on a permanen
0ff0: 74 20 69 6e 64 65 78 2e 20 20 53 69 6e 63 65 0a  t index.  Since.
1000: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72        ** the per
1010: 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20  manent table is 
1020: 68 69 64 64 65 6e 20 62 79 20 74 68 65 20 54 45  hidden by the TE
1030: 4d 50 20 74 61 62 6c 65 2c 20 77 65 20 63 61 6e  MP table, we can
1040: 20 61 6c 73 6f 0a 20 20 20 20 20 20 2a 2a 20 73   also.      ** s
1050: 61 66 65 6c 79 20 69 67 6e 6f 72 65 20 74 68 65  afely ignore the
1060: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 70 65   index on the pe
1070: 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20  rmanent table.. 
1080: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a       */.      /*
1090: 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 3b 0a   Do Nothing */;.
10a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
10b0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 61 72  lite3GetInt32(ar
10c0: 67 76 5b 31 5d 2c 20 26 70 49 6e 64 65 78 2d 3e  gv[1], &pIndex->
10d0: 74 6e 75 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tnum)==0 ){.    
10e0: 20 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28    corruptSchema(
10f0: 70 44 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20  pData, argv[0], 
1100: 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61 67  "invalid rootpag
1110: 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e");.    }.  }. 
1120: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1130: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  .** Attempt to r
1140: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1150: 20 73 63 68 65 6d 61 20 61 6e 64 20 69 6e 69 74   schema and init
1160: 69 61 6c 69 7a 65 20 69 6e 74 65 72 6e 61 6c 0a  ialize internal.
1170: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
1180: 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  es for a single 
1190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
11a0: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
11b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
11c0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 69 44  e is given by iD
11d0: 62 2e 20 20 69 44 62 3d 3d 30 20 69 73 20 75 73  b.  iDb==0 is us
11e0: 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 0a  ed for the main.
11f0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 69 44  ** database.  iD
1200: 62 3d 3d 31 20 73 68 6f 75 6c 64 20 6e 65 76 65  b==1 should neve
1210: 72 20 62 65 20 75 73 65 64 2e 20 20 69 44 62 3e  r be used.  iDb>
1220: 3d 32 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  =2 is used for.*
1230: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
1240: 62 61 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6f  bases.  Return o
1250: 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
1260: 5f 20 65 72 72 6f 72 20 63 6f 64 65 73 20 74 6f  _ error codes to
1270: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 20 73 75 63  .** indicate suc
1280: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 2e  cess or failure.
1290: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12a0: 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 73 71  qlite3InitOne(sq
12b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
12c0: 44 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  Db, char **pzErr
12d0: 4d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Msg){.  int rc;.
12e0: 20 20 69 6e 74 20 69 3b 0a 23 69 66 6e 64 65 66    int i;.#ifndef
12f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1300: 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 73 69  RECATED.  int si
1310: 7a 65 3b 0a 23 65 6e 64 69 66 0a 20 20 54 61 62  ze;.#endif.  Tab
1320: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 44 62 20 2a  le *pTab;.  Db *
1330: 70 44 62 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  pDb;.  char cons
1340: 74 20 2a 61 7a 41 72 67 5b 34 5d 3b 0a 20 20 69  t *azArg[4];.  i
1350: 6e 74 20 6d 65 74 61 5b 35 5d 3b 0a 20 20 49 6e  nt meta[5];.  In
1360: 69 74 44 61 74 61 20 69 6e 69 74 44 61 74 61 3b  itData initData;
1370: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1380: 4d 61 73 74 65 72 53 63 68 65 6d 61 3b 0a 20 20  MasterSchema;.  
1390: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 73  char const *zMas
13a0: 74 65 72 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f  terName;.  int o
13b0: 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e  penedTransaction
13c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   = 0;..  /*.  **
13d0: 20 54 68 65 20 6d 61 73 74 65 72 20 64 61 74 61   The master data
13e0: 62 61 73 65 20 74 61 62 6c 65 20 68 61 73 20 61  base table has a
13f0: 20 73 74 72 75 63 74 75 72 65 20 6c 69 6b 65 20   structure like 
1400: 74 68 69 73 0a 20 20 2a 2f 0a 20 20 73 74 61 74  this.  */.  stat
1410: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6d 61  ic const char ma
1420: 73 74 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20  ster_schema[] = 
1430: 0a 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41  .     "CREATE TA
1440: 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  BLE sqlite_maste
1450: 72 28 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 79  r(\n".     "  ty
1460: 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
1470: 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e   "  name text,\n
1480: 22 0a 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61  ".     "  tbl_na
1490: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
14a0: 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74   "  rootpage int
14b0: 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 22 20  eger,\n".     " 
14c0: 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20   sql text\n".   
14d0: 20 20 22 29 22 0a 20 20 3b 0a 23 69 66 6e 64 65    ")".  ;.#ifnde
14e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
14f0: 4d 50 44 42 0a 20 20 73 74 61 74 69 63 20 63 6f  MPDB.  static co
1500: 6e 73 74 20 63 68 61 72 20 74 65 6d 70 5f 6d 61  nst char temp_ma
1510: 73 74 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20  ster_schema[] = 
1520: 0a 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45  .     "CREATE TE
1530: 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  MP TABLE sqlite_
1540: 74 65 6d 70 5f 6d 61 73 74 65 72 28 5c 6e 22 0a  temp_master(\n".
1550: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
1560: 74 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 6e 61  t,\n".     "  na
1570: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
1580: 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78   "  tbl_name tex
1590: 74 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 72 6f  t,\n".     "  ro
15a0: 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c  otpage integer,\
15b0: 6e 22 0a 20 20 20 20 20 22 20 20 73 71 6c 20 74  n".     "  sql t
15c0: 65 78 74 5c 6e 22 0a 20 20 20 20 20 22 29 22 0a  ext\n".     ")".
15d0: 20 20 3b 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    ;.#else.  #def
15e0: 69 6e 65 20 74 65 6d 70 5f 6d 61 73 74 65 72 5f  ine temp_master_
15f0: 73 63 68 65 6d 61 20 30 0a 23 65 6e 64 69 66 0a  schema 0.#endif.
1600: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
1610: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
1620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
1630: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1640: 6d 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ma );.  assert( 
1650: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1660: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
1670: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
1680: 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  1 || sqlite3Btre
1690: 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e  eHoldsMutex(db->
16a0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b  aDb[iDb].pBt) );
16b0: 0a 0a 20 20 2f 2a 20 7a 4d 61 73 74 65 72 53 63  ..  /* zMasterSc
16c0: 68 65 6d 61 20 61 6e 64 20 7a 49 6e 69 74 53 63  hema and zInitSc
16d0: 72 69 70 74 20 61 72 65 20 73 65 74 20 74 6f 20  ript are set to 
16e0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 61 73  point at the mas
16f0: 74 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  ter schema.  ** 
1700: 61 6e 64 20 69 6e 69 74 69 61 6c 69 73 61 74 69  and initialisati
1710: 6f 6e 20 73 63 72 69 70 74 20 61 70 70 72 6f 70  on script approp
1720: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 64 61  riate for the da
1730: 74 61 62 61 73 65 20 62 65 69 6e 67 0a 20 20 2a  tabase being.  *
1740: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 7a  * initialized. z
1750: 4d 61 73 74 65 72 4e 61 6d 65 20 69 73 20 74 68  MasterName is th
1760: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61  e name of the ma
1770: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  ster table..  */
1780: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
1790: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
17a0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 53 63 68 65  .    zMasterSche
17b0: 6d 61 20 3d 20 74 65 6d 70 5f 6d 61 73 74 65 72  ma = temp_master
17c0: 5f 73 63 68 65 6d 61 3b 0a 20 20 7d 65 6c 73 65  _schema;.  }else
17d0: 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 53 63 68  {.    zMasterSch
17e0: 65 6d 61 20 3d 20 6d 61 73 74 65 72 5f 73 63 68  ema = master_sch
17f0: 65 6d 61 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  ema;.  }.  zMast
1800: 65 72 4e 61 6d 65 20 3d 20 53 43 48 45 4d 41 5f  erName = SCHEMA_
1810: 54 41 42 4c 45 28 69 44 62 29 3b 0a 0a 20 20 2f  TABLE(iDb);..  /
1820: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
1830: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 2e 20 20  schema tables.  
1840: 2a 2f 0a 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20  */.  azArg[0] = 
1850: 7a 4d 61 73 74 65 72 4e 61 6d 65 3b 0a 20 20 61  zMasterName;.  a
1860: 7a 41 72 67 5b 31 5d 20 3d 20 22 31 22 3b 0a 20  zArg[1] = "1";. 
1870: 20 61 7a 41 72 67 5b 32 5d 20 3d 20 7a 4d 61 73   azArg[2] = zMas
1880: 74 65 72 53 63 68 65 6d 61 3b 0a 20 20 61 7a 41  terSchema;.  azA
1890: 72 67 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 6e 69  rg[3] = 0;.  ini
18a0: 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20  tData.db = db;. 
18b0: 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20   initData.iDb = 
18c0: 69 44 62 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e  iDb;.  initData.
18d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18e0: 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 72    initData.pzErr
18f0: 4d 73 67 20 3d 20 70 7a 45 72 72 4d 73 67 3b 0a  Msg = pzErrMsg;.
1900: 20 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c    sqlite3InitCal
1910: 6c 62 61 63 6b 28 26 69 6e 69 74 44 61 74 61 2c  lback(&initData,
1920: 20 33 2c 20 28 63 68 61 72 20 2a 2a 29 61 7a 41   3, (char **)azA
1930: 72 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 69 6e  rg, 0);.  if( in
1940: 69 74 44 61 74 61 2e 72 63 20 29 7b 0a 20 20 20  itData.rc ){.   
1950: 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72   rc = initData.r
1960: 63 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  c;.    goto erro
1970: 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 54 61  r_out;.  }.  pTa
1980: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
1990: 61 62 6c 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  able(db, zMaster
19a0: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
19b0: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b].zName);.  if(
19c0: 20 41 4c 57 41 59 53 28 70 54 61 62 29 20 29 7b   ALWAYS(pTab) ){
19d0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
19e0: 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e  ags |= TF_Readon
19f0: 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72  ly;.  }..  /* Cr
1a00: 65 61 74 65 20 61 20 63 75 72 73 6f 72 20 74 6f  eate a cursor to
1a10: 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 62 61   hold the databa
1a20: 73 65 20 6f 70 65 6e 0a 20 20 2a 2f 0a 20 20 70  se open.  */.  p
1a30: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
1a40: 62 5d 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 70  b];.  if( pDb->p
1a50: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  Bt==0 ){.    if(
1a60: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1a70: 20 41 4c 57 41 59 53 28 69 44 62 3d 3d 31 29 20   ALWAYS(iDb==1) 
1a80: 29 7b 0a 20 20 20 20 20 20 44 62 53 65 74 50 72  ){.      DbSetPr
1a90: 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42  operty(db, 1, DB
1aa0: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a  _SchemaLoaded);.
1ab0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1ac0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ad0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1ae0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
1af0: 72 65 61 64 2d 6f 6e 6c 79 20 28 6f 72 20 72 65  read-only (or re
1b00: 61 64 2d 77 72 69 74 65 29 20 74 72 61 6e 73 61  ad-write) transa
1b10: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 0a 20 20 2a  ction opened.  *
1b20: 2a 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20  * on the b-tree 
1b30: 64 61 74 61 62 61 73 65 2c 20 6f 70 65 6e 20 6f  database, open o
1b40: 6e 65 20 6e 6f 77 2e 20 49 66 20 61 20 74 72 61  ne now. If a tra
1b50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
1b60: 65 64 2c 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c  ed, it .  ** wil
1b70: 6c 20 62 65 20 63 6c 6f 73 65 64 20 62 65 66 6f  l be closed befo
1b80: 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1b90: 20 72 65 74 75 72 6e 73 2e 20 20 2a 2f 0a 20 20   returns.  */.  
1ba0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1bb0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 69  r(pDb->pBt);.  i
1bc0: 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  f( !sqlite3Btree
1bd0: 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 44  IsInReadTrans(pD
1be0: 62 2d 3e 70 42 74 29 20 29 7b 0a 20 20 20 20 72  b->pBt) ){.    r
1bf0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c00: 42 65 67 69 6e 54 72 61 6e 73 28 70 44 62 2d 3e  BeginTrans(pDb->
1c10: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pBt, 0);.    if(
1c20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
1c40: 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
1c50: 67 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45 72  g, db, sqlite3Er
1c60: 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 20  rStr(rc));.     
1c70: 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72   goto initone_er
1c80: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ror_out;.    }. 
1c90: 20 20 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63     openedTransac
1ca0: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  tion = 1;.  }.. 
1cb0: 20 2f 2a 20 47 65 74 20 74 68 65 20 64 61 74 61   /* Get the data
1cc0: 62 61 73 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d  base meta inform
1cd0: 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ation..  **.  **
1ce0: 20 4d 65 74 61 20 76 61 6c 75 65 73 20 61 72 65   Meta values are
1cf0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1d00: 2a 20 20 20 20 6d 65 74 61 5b 30 5d 20 20 20 53  *    meta[0]   S
1d10: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 43  chema cookie.  C
1d20: 68 61 6e 67 65 73 20 77 69 74 68 20 65 61 63 68  hanges with each
1d30: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e 0a   schema change..
1d40: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 31 5d 20    **    meta[1] 
1d50: 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 6f 66    File format of
1d60: 20 73 63 68 65 6d 61 20 6c 61 79 65 72 2e 0a 20   schema layer.. 
1d70: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 32 5d 20 20   **    meta[2]  
1d80: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
1d90: 65 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 20 20  e cache..  **   
1da0: 20 6d 65 74 61 5b 33 5d 20 20 20 4c 61 72 67 65   meta[3]   Large
1db0: 73 74 20 72 6f 6f 74 70 61 67 65 20 28 61 75 74  st rootpage (aut
1dc0: 6f 2f 69 6e 63 72 5f 76 61 63 75 75 6d 20 6d 6f  o/incr_vacuum mo
1dd0: 64 65 29 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61  de).  **    meta
1de0: 5b 34 5d 20 20 20 44 62 20 74 65 78 74 20 65 6e  [4]   Db text en
1df0: 63 6f 64 69 6e 67 2e 20 31 3a 55 54 46 2d 38 20  coding. 1:UTF-8 
1e00: 32 3a 55 54 46 2d 31 36 4c 45 20 33 3a 55 54 46  2:UTF-16LE 3:UTF
1e10: 2d 31 36 42 45 0a 20 20 2a 2a 20 20 20 20 6d 65  -16BE.  **    me
1e20: 74 61 5b 35 5d 20 20 20 55 73 65 72 20 76 65 72  ta[5]   User ver
1e30: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6d 65 74  sion.  **    met
1e40: 61 5b 36 5d 20 20 20 49 6e 63 72 65 6d 65 6e 74  a[6]   Increment
1e50: 61 6c 20 76 61 63 75 75 6d 20 6d 6f 64 65 0a 20  al vacuum mode. 
1e60: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 37 5d 20 20   **    meta[7]  
1e70: 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20 20   unused.  **    
1e80: 6d 65 74 61 5b 38 5d 20 20 20 75 6e 75 73 65 64  meta[8]   unused
1e90: 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 39 5d  .  **    meta[9]
1ea0: 20 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a 0a 20     unused.  **. 
1eb0: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 65 20 23 64   ** Note: The #d
1ec0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 55 54  efined SQLITE_UT
1ed0: 46 2a 20 73 79 6d 62 6f 6c 73 20 69 6e 20 73 71  F* symbols in sq
1ee0: 6c 69 74 65 49 6e 74 2e 68 20 63 6f 72 72 65 73  liteInt.h corres
1ef0: 70 6f 6e 64 20 74 6f 0a 20 20 2a 2a 20 74 68 65  pond to.  ** the
1f00: 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73   possible values
1f10: 20 6f 66 20 6d 65 74 61 5b 34 5d 2e 0a 20 20 2a   of meta[4]..  *
1f20: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  /.  for(i=0; i<A
1f30: 72 72 61 79 53 69 7a 65 28 6d 65 74 61 29 3b 20  rraySize(meta); 
1f40: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1f50: 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 44  3BtreeGetMeta(pD
1f60: 62 2d 3e 70 42 74 2c 20 69 2b 31 2c 20 28 75 33  b->pBt, i+1, (u3
1f70: 32 20 2a 29 26 6d 65 74 61 5b 69 5d 29 3b 0a 20  2 *)&meta[i]);. 
1f80: 20 7d 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d   }.  pDb->pSchem
1f90: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1fa0: 20 3d 20 6d 65 74 61 5b 42 54 52 45 45 5f 53 43   = meta[BTREE_SC
1fb0: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2d 31 5d 3b  HEMA_VERSION-1];
1fc0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e  ..  /* If openin
1fd0: 67 20 61 20 6e 6f 6e 2d 65 6d 70 74 79 20 64 61  g a non-empty da
1fe0: 74 61 62 61 73 65 2c 20 63 68 65 63 6b 20 74 68  tabase, check th
1ff0: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e  e text encoding.
2000: 20 46 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   For the.  ** ma
2010: 69 6e 20 64 61 74 61 62 61 73 65 2c 20 73 65 74  in database, set
2020: 20 73 71 6c 69 74 65 33 2e 65 6e 63 20 74 6f 20   sqlite3.enc to 
2030: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
2040: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2050: 65 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 61  e..  ** For an a
2060: 74 74 61 63 68 65 64 20 64 62 2c 20 69 74 20 69  ttached db, it i
2070: 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  s an error if th
2080: 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 6e 6f  e encoding is no
2090: 74 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20  t the same.  ** 
20a0: 61 73 20 73 71 6c 69 74 65 33 2e 65 6e 63 2e 0a  as sqlite3.enc..
20b0: 20 20 2a 2f 0a 20 20 69 66 28 20 6d 65 74 61 5b    */.  if( meta[
20c0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
20d0: 49 4e 47 2d 31 5d 20 29 7b 20 20 2f 2a 20 74 65  ING-1] ){  /* te
20e0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  xt encoding */. 
20f0: 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b     if( iDb==0 ){
2100: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2110: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
2120: 20 75 38 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20   u8 encoding;.  
2130: 20 20 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e      /* If openin
2140: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
2150: 61 73 65 2c 20 73 65 74 20 45 4e 43 28 64 62 29  ase, set ENC(db)
2160: 2e 20 2a 2f 0a 20 20 20 20 20 20 65 6e 63 6f 64  . */.      encod
2170: 69 6e 67 20 3d 20 28 75 38 29 6d 65 74 61 5b 42  ing = (u8)meta[B
2180: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
2190: 4e 47 2d 31 5d 20 26 20 33 3b 0a 20 20 20 20 20  NG-1] & 3;.     
21a0: 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 3d 3d 30   if( encoding==0
21b0: 20 29 20 65 6e 63 6f 64 69 6e 67 20 3d 20 53 51   ) encoding = SQ
21c0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
21d0: 20 45 4e 43 28 64 62 29 20 3d 20 65 6e 63 6f 64   ENC(db) = encod
21e0: 69 6e 67 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ing;.#else.     
21f0: 20 45 4e 43 28 64 62 29 20 3d 20 53 51 4c 49 54   ENC(db) = SQLIT
2200: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
2210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2220: 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 61 6e  /* If opening an
2230: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
2240: 73 65 2c 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  se, the encoding
2250: 20 6d 75 63 68 20 6d 61 74 63 68 20 45 4e 43 28   much match ENC(
2260: 64 62 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  db) */.      if(
2270: 20 6d 65 74 61 5b 42 54 52 45 45 5f 54 45 58 54   meta[BTREE_TEXT
2280: 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 21 3d 45 4e  _ENCODING-1]!=EN
2290: 43 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  C(db) ){.       
22a0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
22b0: 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  g(pzErrMsg, db, 
22c0: 22 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61  "attached databa
22d0: 73 65 73 20 6d 75 73 74 20 75 73 65 20 74 68 65  ses must use the
22e0: 20 73 61 6d 65 22 0a 20 20 20 20 20 20 20 20 20   same".         
22f0: 20 20 20 22 20 74 65 78 74 20 65 6e 63 6f 64 69     " text encodi
2300: 6e 67 20 61 73 20 6d 61 69 6e 20 64 61 74 61 62  ng as main datab
2310: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ase");.        r
2320: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2330: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69  ;.        goto i
2340: 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74  nitone_error_out
2350: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 62 53    }else{.    DbS
2370: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  etProperty(db, i
2380: 44 62 2c 20 44 42 5f 45 6d 70 74 79 29 3b 0a 20  Db, DB_Empty);. 
2390: 20 7d 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d   }.  pDb->pSchem
23a0: 61 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  a->enc = ENC(db)
23b0: 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  ;..  if( pDb->pS
23c0: 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a  chema->cache_siz
23d0: 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
23e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
23f0: 45 43 41 54 45 44 0a 20 20 20 20 73 69 7a 65 20  ECATED.    size 
2400: 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2410: 32 28 6d 65 74 61 5b 42 54 52 45 45 5f 44 45 46  2(meta[BTREE_DEF
2420: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2d  AULT_CACHE_SIZE-
2430: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a  1]);.    if( siz
2440: 65 3d 3d 30 20 29 7b 20 73 69 7a 65 20 3d 20 53  e==0 ){ size = S
2450: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
2460: 43 48 45 5f 53 49 5a 45 3b 20 7d 0a 20 20 20 20  CHE_SIZE; }.    
2470: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
2480: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
2490: 0a 23 65 6c 73 65 0a 20 20 20 20 70 44 62 2d 3e  .#else.    pDb->
24a0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
24b0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
24c0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b  AULT_CACHE_SIZE;
24d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
24e0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
24f0: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
2500: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
2510: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  he_size);.  }.. 
2520: 20 2f 2a 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f   /*.  ** file_fo
2530: 72 6d 61 74 3d 3d 31 20 20 20 20 56 65 72 73 69  rmat==1    Versi
2540: 6f 6e 20 33 2e 30 2e 30 2e 0a 20 20 2a 2a 20 66  on 3.0.0..  ** f
2550: 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 32 20 20 20  ile_format==2   
2560: 20 56 65 72 73 69 6f 6e 20 33 2e 31 2e 33 2e 20   Version 3.1.3. 
2570: 20 2f 2f 20 41 4c 54 45 52 20 54 41 42 4c 45 20   // ALTER TABLE 
2580: 41 44 44 20 43 4f 4c 55 4d 4e 0a 20 20 2a 2a 20  ADD COLUMN.  ** 
2590: 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 33 20 20  file_format==3  
25a0: 20 20 56 65 72 73 69 6f 6e 20 33 2e 31 2e 34 2e    Version 3.1.4.
25b0: 20 20 2f 2f 20 64 69 74 74 6f 20 62 75 74 20 77    // ditto but w
25c0: 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66  ith non-NULL def
25d0: 61 75 6c 74 73 0a 20 20 2a 2a 20 66 69 6c 65 5f  aults.  ** file_
25e0: 66 6f 72 6d 61 74 3d 3d 34 20 20 20 20 56 65 72  format==4    Ver
25f0: 73 69 6f 6e 20 33 2e 33 2e 30 2e 20 20 2f 2f 20  sion 3.3.0.  // 
2600: 44 45 53 43 20 69 6e 64 69 63 65 73 2e 20 20 42  DESC indices.  B
2610: 6f 6f 6c 65 61 6e 20 63 6f 6e 73 74 61 6e 74 73  oolean constants
2620: 0a 20 20 2a 2f 0a 20 20 70 44 62 2d 3e 70 53 63  .  */.  pDb->pSc
2630: 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
2640: 74 20 3d 20 28 75 38 29 6d 65 74 61 5b 42 54 52  t = (u8)meta[BTR
2650: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2d 31  EE_FILE_FORMAT-1
2660: 5d 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  ];.  if( pDb->pS
2670: 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
2680: 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 62  at==0 ){.    pDb
2690: 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
26a0: 66 6f 72 6d 61 74 20 3d 20 31 3b 0a 20 20 7d 0a  format = 1;.  }.
26b0: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
26c0: 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
26d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
26e0: 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 73 71  FORMAT ){.    sq
26f0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70  lite3SetString(p
2700: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 75 6e  zErrMsg, db, "un
2710: 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 20 66  supported file f
2720: 6f 72 6d 61 74 22 29 3b 0a 20 20 20 20 72 63 20  ormat");.    rc 
2730: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2740: 20 20 20 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65      goto initone
2750: 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a  _error_out;.  }.
2760: 0a 20 20 2f 2a 20 54 69 63 6b 65 74 20 23 32 38  .  /* Ticket #28
2770: 30 34 3a 20 20 57 68 65 6e 20 77 65 20 6f 70 65  04:  When we ope
2780: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 20  n a database in 
2790: 74 68 65 20 6e 65 77 65 72 20 66 69 6c 65 20 66  the newer file f
27a0: 6f 72 6d 61 74 2c 0a 20 20 2a 2a 20 63 6c 65 61  ormat,.  ** clea
27b0: 72 20 74 68 65 20 6c 65 67 61 63 79 5f 66 69 6c  r the legacy_fil
27c0: 65 5f 66 6f 72 6d 61 74 20 70 72 61 67 6d 61 20  e_format pragma 
27d0: 66 6c 61 67 20 73 6f 20 74 68 61 74 20 61 20 56  flag so that a V
27e0: 41 43 55 55 4d 20 77 69 6c 6c 0a 20 20 2a 2a 20  ACUUM will.  ** 
27f0: 6e 6f 74 20 64 6f 77 6e 67 72 61 64 65 20 74 68  not downgrade th
2800: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
2810: 68 75 73 20 69 6e 76 61 6c 69 64 61 74 65 20 61  hus invalidate a
2820: 6e 79 20 64 65 73 63 65 6e 64 69 6e 67 0a 20 20  ny descending.  
2830: 2a 2a 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  ** indices that 
2840: 74 68 65 20 75 73 65 72 20 6d 69 67 68 74 20 68  the user might h
2850: 61 76 65 20 63 72 65 61 74 65 64 2e 0a 20 20 2a  ave created..  *
2860: 2f 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 26  /.  if( iDb==0 &
2870: 26 20 6d 65 74 61 5b 42 54 52 45 45 5f 46 49 4c  & meta[BTREE_FIL
2880: 45 5f 46 4f 52 4d 41 54 2d 31 5d 3e 3d 34 20 29  E_FORMAT-1]>=4 )
2890: 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  {.    db->flags 
28a0: 26 3d 20 7e 53 51 4c 49 54 45 5f 4c 65 67 61 63  &= ~SQLITE_Legac
28b0: 79 46 69 6c 65 46 6d 74 3b 0a 20 20 7d 0a 0a 20  yFileFmt;.  }.. 
28c0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63 68   /* Read the sch
28d0: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
28e0: 6f 75 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  out of the schem
28f0: 61 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  a tables.  */.  
2900: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
2910: 2e 62 75 73 79 20 29 3b 0a 20 20 7b 0a 20 20 20  .busy );.  {.   
2920: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
2930: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d   zSql = sqlite3M
2940: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
2950: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2960: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
2970: 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 4f 52 44  FROM '%q'.%s ORD
2980: 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20  ER BY rowid",.  
2990: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
29a0: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 4d 61 73 74 65  b].zName, zMaste
29b0: 72 4e 61 6d 65 29 3b 0a 23 69 66 6e 64 65 66 20  rName);.#ifndef 
29c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
29d0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 7b 0a  ORIZATION.    {.
29e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 78 61        sqlite3_xa
29f0: 75 74 68 20 78 41 75 74 68 3b 0a 20 20 20 20 20  uth xAuth;.     
2a00: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
2a10: 74 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78 41  th;.      db->xA
2a20: 75 74 68 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  uth = 0;.#endif.
2a30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a40: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2a50: 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c  , sqlite3InitCal
2a60: 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61  lback, &initData
2a70: 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
2a80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
2a90: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 64 62  IZATION.      db
2aa0: 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
2ab0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2ac0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ad0: 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44  _OK ) rc = initD
2ae0: 61 74 61 2e 72 63 3b 0a 20 20 20 20 73 71 6c 69  ata.rc;.    sqli
2af0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
2b00: 71 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ql);.#ifndef SQL
2b10: 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
2b20: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b40: 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c  sqlite3AnalysisL
2b50: 6f 61 64 28 64 62 2c 20 69 44 62 29 3b 0a 20 20  oad(db, iDb);.  
2b60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
2b70: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2b80: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ailed ){.    rc 
2b90: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
2bb0: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
2bc0: 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a  ection(db);.  }.
2bd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2be0: 5f 4f 4b 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67  _OK || (db->flag
2bf0: 73 26 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  s&SQLITE_Recover
2c00: 79 4d 6f 64 65 29 29 7b 0a 20 20 20 20 2f 2a 20  yMode)){.    /* 
2c10: 42 6c 61 63 6b 20 6d 61 67 69 63 3a 20 49 66 20  Black magic: If 
2c20: 74 68 65 20 53 51 4c 49 54 45 5f 52 65 63 6f 76  the SQLITE_Recov
2c30: 65 72 79 4d 6f 64 65 20 66 6c 61 67 20 69 73 20  eryMode flag is 
2c40: 73 65 74 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  set, then consid
2c50: 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  er.    ** the sc
2c60: 68 65 6d 61 20 6c 6f 61 64 65 64 2c 20 65 76 65  hema loaded, eve
2c70: 6e 20 69 66 20 65 72 72 6f 72 73 20 6f 63 63 75  n if errors occu
2c80: 72 72 65 64 2e 20 49 6e 20 74 68 69 73 20 73 69  rred. In this si
2c90: 74 75 61 74 69 6f 6e 20 74 68 65 20 0a 20 20 20  tuation the .   
2ca0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 71 6c 69   ** current sqli
2cb0: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f 70  te3_prepare() op
2cc0: 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 66 61 69  eration will fai
2cd0: 6c 2c 20 62 75 74 20 74 68 65 20 66 6f 6c 6c 6f  l, but the follo
2ce0: 77 69 6e 67 20 6f 6e 65 0a 20 20 20 20 2a 2a 20  wing one.    ** 
2cf0: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  will attempt to 
2d00: 63 6f 6d 70 69 6c 65 20 74 68 65 20 73 75 70 70  compile the supp
2d10: 6c 69 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  lied statement a
2d20: 67 61 69 6e 73 74 20 77 68 61 74 65 76 65 72 20  gainst whatever 
2d30: 73 75 62 73 65 74 0a 20 20 20 20 2a 2a 20 6f 66  subset.    ** of
2d40: 20 74 68 65 20 73 63 68 65 6d 61 20 77 61 73 20   the schema was 
2d50: 6c 6f 61 64 65 64 20 62 65 66 6f 72 65 20 74 68  loaded before th
2d60: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
2d70: 2e 20 54 68 65 20 70 72 69 6d 61 72 79 0a 20 20  . The primary.  
2d80: 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20    ** purpose of 
2d90: 74 68 69 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77  this is to allow
2da0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 73   access to the s
2db0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2dc0: 6c 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  le.    ** even w
2dd0: 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  hen its contents
2de0: 20 68 61 76 65 20 62 65 65 6e 20 63 6f 72 72 75   have been corru
2df0: 70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pted..    */.   
2e00: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
2e10: 62 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d  b, iDb, DB_Schem
2e20: 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 72 63  aLoaded);.    rc
2e30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e40: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
2e50: 65 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 74  e for an error t
2e60: 68 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  hat occurs after
2e70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6c   successfully al
2e80: 6c 6f 63 61 74 69 6e 67 0a 20 20 2a 2a 20 63 75  locating.  ** cu
2e90: 72 4d 61 69 6e 20 61 6e 64 20 63 61 6c 6c 69 6e  rMain and callin
2ea0: 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  g sqlite3BtreeEn
2eb0: 74 65 72 28 29 2e 20 46 6f 72 20 61 6e 20 65 72  ter(). For an er
2ec0: 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 0a  ror that occurs.
2ed0: 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 61 74    ** before that
2ee0: 20 70 6f 69 6e 74 2c 20 6a 75 6d 70 20 74 6f 20   point, jump to 
2ef0: 65 72 72 6f 72 5f 6f 75 74 2e 0a 20 20 2a 2f 0a  error_out..  */.
2f00: 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75  initone_error_ou
2f10: 74 3a 0a 20 20 69 66 28 20 6f 70 65 6e 65 64 54  t:.  if( openedT
2f20: 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
2f30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
2f40: 6d 6d 69 74 28 70 44 62 2d 3e 70 42 74 29 3b 0a  mmit(pDb->pBt);.
2f50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
2f60: 65 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74  eeLeave(pDb->pBt
2f70: 29 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  );..error_out:. 
2f80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f90: 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c  NOMEM || rc==SQL
2fa0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
2fb0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
2fc0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
2fd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2fe0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2ff0: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  e all database f
3000: 69 6c 65 73 20 2d 20 74 68 65 20 6d 61 69 6e 20  iles - the main 
3010: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
3020: 68 65 20 66 69 6c 65 0a 2a 2a 20 75 73 65 64 20  he file.** used 
3030: 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61  to store tempora
3040: 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 61  ry tables, and a
3050: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 64 61  ny additional da
3060: 74 61 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a 20  tabase files.** 
3070: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 41 54  created using AT
3080: 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e  TACH statements.
3090: 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
30a0: 73 73 20 63 6f 64 65 2e 20 20 49 66 20 61 6e 0a  ss code.  If an.
30b0: 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  ** error occurs,
30c0: 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
30d0: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 2a 70 7a  message into *pz
30e0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 41 66  ErrMsg..**.** Af
30f0: 74 65 72 20 61 20 64 61 74 61 62 61 73 65 20 69  ter a database i
3100: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74  s initialized, t
3110: 68 65 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  he DB_SchemaLoad
3120: 65 64 20 62 69 74 20 69 73 20 73 65 74 0a 2a 2a  ed bit is set.**
3130: 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
3140: 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
3150: 66 20 74 68 65 20 44 62 20 73 74 72 75 63 74 75  f the Db structu
3160: 72 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  re. If the datab
3170: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 61 73 20  ase.** file was 
3180: 6f 66 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 2c 20  of zero-length, 
3190: 74 68 65 6e 20 74 68 65 20 44 42 5f 45 6d 70 74  then the DB_Empt
31a0: 79 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73  y flag is also s
31b0: 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
31c0: 65 33 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a  e3Init(sqlite3 *
31d0: 64 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  db, char **pzErr
31e0: 4d 73 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 72  Msg){.  int i, r
31f0: 63 3b 0a 20 20 69 6e 74 20 63 6f 6d 6d 69 74 5f  c;.  int commit_
3200: 69 6e 74 65 72 6e 61 6c 20 3d 20 21 28 64 62 2d  internal = !(db-
3210: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
3220: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
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: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32c0: 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
32d0: 3d 20 31 3b 0a 20 20 45 4e 43 28 64 62 29 20 3d  = 1;.  ENC(db) =
32e0: 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b   SCHEMA_ENC(db);
32f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
3300: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
3310: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3320: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
3330: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63  rty(db, i, DB_Sc
3340: 68 65 6d 61 4c 6f 61 64 65 64 29 20 7c 7c 20 69  hemaLoaded) || i
3350: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
3360: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3370: 49 6e 69 74 4f 6e 65 28 64 62 2c 20 69 2c 20 70  InitOne(db, i, p
3380: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
3390: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ( rc ){.      sq
33a0: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
33b0: 65 6d 61 28 64 62 2c 20 69 29 3b 0a 20 20 20 20  ema(db, i);.    
33c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 63 65  }.  }..  /* Once
33d0: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 64   all the other d
33e0: 61 74 61 62 61 73 65 73 20 68 61 76 65 20 62 65  atabases have be
33f0: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  en initialized, 
3400: 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 0a  load the schema.
3410: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 54 45 4d    ** for the TEM
3420: 50 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  P database. This
3430: 20 69 73 20 6c 6f 61 64 65 64 20 6c 61 73 74 2c   is loaded last,
3440: 20 61 73 20 74 68 65 20 54 45 4d 50 20 64 61 74   as the TEMP dat
3450: 61 62 61 73 65 0a 20 20 2a 2a 20 73 63 68 65 6d  abase.  ** schem
3460: 61 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 72 65  a may contain re
3470: 66 65 72 65 6e 63 65 73 20 74 6f 20 6f 62 6a 65  ferences to obje
3480: 63 74 73 20 69 6e 20 6f 74 68 65 72 20 64 61 74  cts in other dat
3490: 61 62 61 73 65 73 2e 0a 20 20 2a 2f 0a 23 69 66  abases..  */.#if
34a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34b0: 5f 54 45 4d 50 44 42 0a 20 20 61 73 73 65 72 74  _TEMPDB.  assert
34c0: 28 20 64 62 2d 3e 6e 44 62 3e 31 20 29 3b 0a 20  ( db->nDb>1 );. 
34d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34e0: 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
34f0: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 53  erty(db, 1, DB_S
3500: 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
3510: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3520: 49 6e 69 74 4f 6e 65 28 64 62 2c 20 31 2c 20 70  InitOne(db, 1, p
3530: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
3540: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ( rc ){.      sq
3550: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
3560: 65 6d 61 28 64 62 2c 20 31 29 3b 0a 20 20 20 20  ema(db, 1);.    
3570: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
3580: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
3590: 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
35a0: 49 54 45 5f 4f 4b 20 26 26 20 63 6f 6d 6d 69 74  ITE_OK && commit
35b0: 5f 69 6e 74 65 72 6e 61 6c 20 29 7b 0a 20 20 20  _internal ){.   
35c0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
35d0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
35e0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
35f0: 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   rc; .}../*.** T
3600: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
3610: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 64 61   no-op if the da
3620: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
3630: 20 61 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c   already initial
3640: 69 7a 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ized..** Otherwi
3650: 73 65 2c 20 74 68 65 20 73 63 68 65 6d 61 20 69  se, the schema i
3660: 73 20 6c 6f 61 64 65 64 2e 20 41 6e 20 65 72 72  s loaded. An err
3670: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3680: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
3690: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 50 61  te3ReadSchema(Pa
36a0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
36b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36c0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  OK;.  sqlite3 *d
36d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
36e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
3700: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
3710: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
3720: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3730: 74 65 33 49 6e 69 74 28 64 62 2c 20 26 70 50 61  te3Init(db, &pPa
3740: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  rse->zErrMsg);. 
3750: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
3760: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
3770: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
3780: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3790: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
37a0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  rc;.}.../*.** Ch
37b0: 65 63 6b 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  eck schema cooki
37c0: 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
37d0: 73 65 73 2e 20 20 49 66 20 61 6e 79 20 63 6f 6f  ses.  If any coo
37e0: 6b 69 65 20 69 73 20 6f 75 74 0a 2a 2a 20 6f 66  kie is out.** of
37f0: 20 64 61 74 65 20 73 65 74 20 70 50 61 72 73 65   date set pParse
3800: 2d 3e 72 63 20 74 6f 20 53 51 4c 49 54 45 5f 53  ->rc to SQLITE_S
3810: 43 48 45 4d 41 2e 20 20 49 66 20 61 6c 6c 20 73  CHEMA.  If all s
3820: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 0a 2a 2a  chema cookies.**
3830: 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
3840: 20 74 6f 20 70 50 61 72 73 65 2d 3e 72 63 2e 0a   to pParse->rc..
3850: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3860: 63 68 65 6d 61 49 73 56 61 6c 69 64 28 50 61 72  chemaIsValid(Par
3870: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
3880: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3890: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
38a0: 44 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Db;.  int rc;.  
38b0: 69 6e 74 20 63 6f 6f 6b 69 65 3b 0a 0a 20 20 61  int cookie;..  a
38c0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
38d0: 68 65 63 6b 53 63 68 65 6d 61 20 29 3b 0a 20 20  heckSchema );.  
38e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
38f0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
3900: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
3910: 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  Db=0; iDb<db->nD
3920: 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 69  b; iDb++){.    i
3930: 6e 74 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63  nt openedTransac
3940: 74 69 6f 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  tion = 0;       
3950: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
3960: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
3970: 65 6e 65 64 20 2a 2f 0a 20 20 20 20 42 74 72 65  ened */.    Btre
3980: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
3990: 5b 69 44 62 5d 2e 70 42 74 3b 20 20 20 20 20 2f  [iDb].pBt;     /
39a0: 2a 20 42 74 72 65 65 20 64 61 74 61 62 61 73 65  * Btree database
39b0: 20 74 6f 20 72 65 61 64 20 63 6f 6f 6b 69 65 20   to read cookie 
39c0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 66 28 20  from */.    if( 
39d0: 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pBt==0 ) continu
39e0: 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
39f0: 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
3a00: 64 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  dy a read-only (
3a10: 6f 72 20 72 65 61 64 2d 77 72 69 74 65 29 20 74  or read-write) t
3a20: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
3a30: 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  d.    ** on the 
3a40: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
3a50: 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49   open one now. I
3a60: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
3a70: 69 73 20 6f 70 65 6e 65 64 2c 20 69 74 20 0a 20  is opened, it . 
3a80: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c     ** will be cl
3a90: 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  osed immediately
3aa0: 20 61 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   after reading t
3ab0: 68 65 20 6d 65 74 61 2d 76 61 6c 75 65 2e 20 2a  he meta-value. *
3ac0: 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
3ad0: 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54  e3BtreeIsInReadT
3ae0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
3af0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
3b00: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
3b10: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 0);.      if
3b20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
3b30: 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  EM || rc==SQLITE
3b40: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
3b50: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
3b60: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
3b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3b80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3b90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 6f 70  return;.      op
3ba0: 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20  enedTransaction 
3bb0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
3bc0: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63 68 65  /* Read the sche
3bd0: 6d 61 20 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74  ma cookie from t
3be0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
3bf0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  it does not matc
3c00: 68 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 76 61  h the .    ** va
3c10: 6c 75 65 20 73 74 6f 72 65 64 20 61 73 20 70 61  lue stored as pa
3c20: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
3c30: 6f 72 79 20 73 63 68 65 6d 61 20 72 65 70 72 65  ory schema repre
3c40: 73 65 6e 74 61 74 69 6f 6e 2c 0a 20 20 20 20 2a  sentation,.    *
3c50: 2a 20 73 65 74 20 50 61 72 73 65 2e 72 63 20 74  * set Parse.rc t
3c60: 6f 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e  o SQLITE_SCHEMA.
3c70: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
3c80: 74 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c  treeGetMeta(pBt,
3c90: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
3ca0: 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 63  RSION, (u32 *)&c
3cb0: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 61 73 73 65  ookie);.    asse
3cc0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3cd0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3ce0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
3cf0: 28 20 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e 61 44  ( cookie!=db->aD
3d00: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
3d10: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b  schema_cookie ){
3d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
3d30: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c  setOneSchema(db,
3d40: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 70 50 61   iDb);.      pPa
3d50: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
3d60: 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 7d 0a 0a  _SCHEMA;.    }..
3d70: 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65      /* Close the
3d80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
3d90: 20 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65 64 2e   one was opened.
3da0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 65 6e   */.    if( open
3db0: 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  edTransaction ){
3dc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3dd0: 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
3de0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3df0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 68  ** Convert a sch
3e00: 65 6d 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ema pointer into
3e10: 20 74 68 65 20 69 44 62 20 69 6e 64 65 78 20 74   the iDb index t
3e20: 68 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  hat indicates.**
3e30: 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65 20   which database 
3e40: 66 69 6c 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  file in db->aDb[
3e50: 5d 20 74 68 65 20 73 63 68 65 6d 61 20 72 65 66  ] the schema ref
3e60: 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ers to..**.** If
3e70: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
3e80: 73 65 20 69 73 20 61 74 74 61 63 68 65 64 20 6d  se is attached m
3e90: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74  ore than once, t
3ea0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 74 74 61  he first.** atta
3eb0: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69 73  ched database is
3ec0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
3ed0: 74 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  t sqlite3SchemaT
3ee0: 6f 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  oIndex(sqlite3 *
3ef0: 64 62 2c 20 53 63 68 65 6d 61 20 2a 70 53 63 68  db, Schema *pSch
3f00: 65 6d 61 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ema){.  int i = 
3f10: 2d 31 30 30 30 30 30 30 3b 0a 0a 20 20 2f 2a 20  -1000000;..  /* 
3f20: 49 66 20 70 53 63 68 65 6d 61 20 69 73 20 4e 55  If pSchema is NU
3f30: 4c 4c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  LL, then return 
3f40: 2d 31 30 30 30 30 30 30 2e 20 54 68 69 73 20 68  -1000000. This h
3f50: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 65  appens when code
3f60: 20 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e 63   in .  ** expr.c
3f70: 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 72 65   is trying to re
3f80: 73 6f 6c 76 65 20 61 20 72 65 66 65 72 65 6e 63  solve a referenc
3f90: 65 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  e to a transient
3fa0: 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e 65   table (i.e. one
3fb0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
3fc0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2e 20   a sub-select). 
3fd0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
3fe0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
3ff0: 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
4000: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  tion should neve
4010: 72 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 0a  r be used..  **.
4020: 20 20 2a 2a 20 57 65 20 72 65 74 75 72 6e 20 2d    ** We return -
4030: 31 30 30 30 30 30 30 20 69 6e 73 74 65 61 64 20  1000000 instead 
4040: 6f 66 20 74 68 65 20 6d 6f 72 65 20 75 73 75 61  of the more usua
4050: 6c 20 2d 31 20 73 69 6d 70 6c 79 20 62 65 63 61  l -1 simply beca
4060: 75 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20 2d  use using.  ** -
4070: 31 30 30 30 30 30 30 20 61 73 20 74 68 65 20 69  1000000 as the i
4080: 6e 63 6f 72 72 65 63 74 20 69 6e 64 65 78 20 69  ncorrect index i
4090: 6e 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69 73  nto db->aDb[] is
40a0: 20 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72 65   much .  ** more
40b0: 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75 73 65   likely to cause
40c0: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 61 6e   a segfault than
40d0: 20 2d 31 20 28 6f 66 20 63 6f 75 72 73 65 20 74   -1 (of course t
40e0: 68 65 72 65 20 61 72 65 20 61 73 73 65 72 74 28  here are assert(
40f0: 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ).  ** statement
4100: 73 20 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e 65  s too, but it ne
4110: 76 65 72 20 68 75 72 74 73 20 74 6f 20 70 6c 61  ver hurts to pla
4120: 79 20 74 68 65 20 6f 64 64 73 29 2e 0a 20 20 2a  y the odds)..  *
4130: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
4140: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
4150: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
4160: 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  f( pSchema ){.  
4170: 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
4180: 53 28 69 3c 64 62 2d 3e 6e 44 62 29 3b 20 69 2b  S(i<db->nDb); i+
4190: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  +){.      if( db
41a0: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
41b0: 3d 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ==pSchema ){.   
41c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
41e0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
41f0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7d 0a 20  db->nDb );.  }. 
4200: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
4210: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
4220: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
4230: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 6f 62  in the pParse ob
4240: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
4250: 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74 28  ite3ParserReset(
4260: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
4270: 20 20 69 66 28 20 70 50 61 72 73 65 20 29 7b 0a    if( pParse ){.
4280: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4290: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
42a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
42b0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  db, pParse->aLab
42c0: 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
42d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
42e0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  b, pParse->pCons
42f0: 74 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tExpr);.  }.}../
4300: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65  *.** Compile the
4310: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53   UTF-8 encoded S
4320: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a 53 71  QL statement zSq
4330: 6c 20 69 6e 74 6f 20 61 20 73 74 61 74 65 6d 65  l into a stateme
4340: 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
4350: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4360: 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Prepare(.  sqlit
4370: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
4380: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4390: 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f   handle. */.  co
43a0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
43b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38          /* UTF-8
43c0: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
43d0: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  tement. */.  int
43e0: 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20   nBytes,        
43f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4400: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
4410: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  s. */.  int save
4420: 53 71 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 20  SqlFlag,        
4430: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f 70    /* True to cop
4440: 79 20 53 51 4c 20 74 65 78 74 20 69 6e 74 6f 20  y SQL text into 
4450: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  the sqlite3_stmt
4460: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70 52 65 70   */.  Vdbe *pRep
4470: 72 65 70 61 72 65 2c 20 20 20 20 20 20 20 20 20  repare,         
4480: 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65 70 72  /* VM being repr
4490: 65 70 61 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  epared */.  sqli
44a0: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
44b0: 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20  t,    /* OUT: A 
44c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
44d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
44e0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
44f0: 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20  r **pzTail      
4500: 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20   /* OUT: End of 
4510: 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f  parsed string */
4520: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
4530: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
4540: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
4550: 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  xt */.  char *zE
4560: 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
4570: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
4580: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ge */.  int rc =
4590: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
45a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
45e0: 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
45f0: 65 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  e the parsing co
4600: 6e 74 65 78 74 20 2a 2f 0a 20 20 70 50 61 72 73  ntext */.  pPars
4610: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  e = sqlite3Stack
4620: 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  AllocZero(db, si
4630: 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b 0a  zeof(*pParse));.
4640: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
4650: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
4660: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
4670: 74 6f 20 65 6e 64 5f 70 72 65 70 61 72 65 3b 0a  to end_prepare;.
4680: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 52    }.  pParse->pR
4690: 65 70 72 65 70 61 72 65 20 3d 20 70 52 65 70 72  eprepare = pRepr
46a0: 65 70 61 72 65 3b 0a 20 20 61 73 73 65 72 74 28  epare;.  assert(
46b0: 20 70 70 53 74 6d 74 20 26 26 20 2a 70 70 53 74   ppStmt && *ppSt
46c0: 6d 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  mt==0 );.  asser
46d0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
46e0: 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  iled );.  assert
46f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4700: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
4710: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
4720: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74  o verify that it
4730: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
4740: 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  get a read lock 
4750: 6f 6e 20 61 6c 6c 0a 20 20 2a 2a 20 64 61 74 61  on all.  ** data
4760: 62 61 73 65 20 73 63 68 65 6d 61 73 2e 20 20 54  base schemas.  T
4770: 68 65 20 69 6e 61 62 69 6c 69 74 79 20 74 6f 20  he inability to 
4780: 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  get a read lock 
4790: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 20  indicates that. 
47a0: 20 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   ** some other d
47b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
47c0: 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  on is holding a 
47d0: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 77 68 69 63  write-lock, whic
47e0: 68 20 69 6e 0a 20 20 2a 2a 20 74 75 72 6e 20 6d  h in.  ** turn m
47f0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 74  eans that the ot
4800: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
4810: 61 73 20 6d 61 64 65 20 75 6e 63 6f 6d 6d 69 74  as made uncommit
4820: 74 65 64 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ted changes.  **
4830: 20 74 6f 20 74 68 65 20 73 63 68 65 6d 61 2e 0a   to the schema..
4840: 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 72 65 20 77    **.  ** Were w
4850: 65 20 74 6f 20 70 72 6f 63 65 65 64 20 61 6e 64  e to proceed and
4860: 20 70 72 65 70 61 72 65 20 74 68 65 20 73 74 61   prepare the sta
4870: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 74  tement against t
4880: 68 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a 20  he uncommitted. 
4890: 20 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67   ** schema chang
48a0: 65 73 20 61 6e 64 20 69 66 20 74 68 6f 73 65 20  es and if those 
48b0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
48c0: 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20  re subsequently 
48d0: 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
48e0: 20 61 6e 64 20 64 69 66 66 65 72 65 6e 74 20 63   and different c
48f0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
4900: 69 6e 20 74 68 65 69 72 20 70 6c 61 63 65 2c 20  in their place, 
4910: 74 68 65 6e 20 77 68 65 6e 20 74 68 69 73 0a 20  then when this. 
4920: 20 2a 2a 20 70 72 65 70 61 72 65 64 20 73 74 61   ** prepared sta
4930: 74 65 6d 65 6e 74 20 67 6f 65 73 20 74 6f 20 72  tement goes to r
4940: 75 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  un the schema co
4950: 6f 6b 69 65 20 77 6f 75 6c 64 20 66 61 69 6c 20  okie would fail 
4960: 74 6f 20 64 65 74 65 63 74 0a 20 20 2a 2a 20 74  to detect.  ** t
4970: 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  he schema change
4980: 2e 20 20 44 69 73 61 73 74 65 72 20 77 6f 75 6c  .  Disaster woul
4990: 64 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2a 0a 20  d follow..  **. 
49a0: 20 2a 2a 20 54 68 69 73 20 74 68 72 65 61 64 20   ** This thread 
49b0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c  is currently hol
49c0: 64 69 6e 67 20 6d 75 74 65 78 65 73 20 6f 6e 20  ding mutexes on 
49d0: 61 6c 6c 20 42 74 72 65 65 73 20 28 62 65 63 61  all Btrees (beca
49e0: 75 73 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  use.  ** of the 
49f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
4a00: 72 41 6c 6c 28 29 20 69 6e 20 73 71 6c 69 74 65  rAll() in sqlite
4a10: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28  3LockAndPrepare(
4a20: 29 29 20 73 6f 20 69 74 0a 20 20 2a 2a 20 69 73  )) so it.  ** is
4a30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
4a40: 72 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  r another thread
4a50: 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
4a60: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 20 20  schema change.  
4a70: 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f  ** while this ro
4a80: 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67  utine is running
4a90: 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 64 6f 20  .  Hence, we do 
4aa0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 68 6f 6c 64  not need to hold
4ab0: 20 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20   .  ** locks on 
4ac0: 74 68 65 20 73 63 68 65 6d 61 2c 20 77 65 20 6a  the schema, we j
4ad0: 75 73 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  ust need to make
4ae0: 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 65 6c 73   sure nobody els
4af0: 65 20 69 73 20 0a 20 20 2a 2a 20 68 6f 6c 64 69  e is .  ** holdi
4b00: 6e 67 20 74 68 65 6d 2e 0a 20 20 2a 2a 0a 20 20  ng them..  **.  
4b10: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73 65 74  ** Note that set
4b20: 74 69 6e 67 20 52 45 41 44 5f 55 4e 43 4f 4d 4d  ting READ_UNCOMM
4b30: 49 54 54 45 44 20 6f 76 65 72 72 69 64 65 73 20  ITTED overrides 
4b40: 6d 6f 73 74 20 6c 6f 63 6b 20 64 65 74 65 63 74  most lock detect
4b50: 69 6f 6e 2c 0a 20 20 2a 2a 20 62 75 74 20 69 74  ion,.  ** but it
4b60: 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 6f 76 65 72   does *not* over
4b70: 72 69 64 65 20 73 63 68 65 6d 61 20 6c 6f 63 6b  ride schema lock
4b80: 20 64 65 74 65 63 74 69 6f 6e 2c 20 73 6f 20 74   detection, so t
4b90: 68 69 73 20 61 6c 6c 20 73 74 69 6c 6c 0a 20 20  his all still.  
4ba0: 2a 2a 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66  ** works even if
4bb0: 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
4bc0: 44 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  D is set..  */. 
4bd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4be0: 6e 44 62 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  nDb; i++) {.    
4bf0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
4c00: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
4c10: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
4c20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4c30: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
4c40: 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
4c50: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
4c60: 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 70 42 74  SchemaLocked(pBt
4c70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
4c80: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
4c90: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
4ca0: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  >aDb[i].zName;. 
4cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
4cc0: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
4cd0: 63 2c 20 22 64 61 74 61 62 61 73 65 20 73 63 68  c, "database sch
4ce0: 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25  ema is locked: %
4cf0: 73 22 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  s", zDb);.      
4d00: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
4d10: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
4d20: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 29  eadUncommitted )
4d30: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
4d40: 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20  nd_prepare;.    
4d50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4d60: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
4d70: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 70  ckList(db);..  p
4d80: 50 61 72 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a  Parse->db = db;.
4d90: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
4da0: 4c 6f 6f 70 20 3d 20 30 3b 20 20 2f 2a 20 4c 6f  Loop = 0;  /* Lo
4db0: 67 61 72 69 74 68 6d 69 63 2c 20 73 6f 20 30 20  garithmic, so 0 
4dc0: 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 31 20 2a  really means 1 *
4dd0: 2f 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3e 3d  /.  if( nBytes>=
4de0: 30 20 26 26 20 28 6e 42 79 74 65 73 3d 3d 30 20  0 && (nBytes==0 
4df0: 7c 7c 20 7a 53 71 6c 5b 6e 42 79 74 65 73 2d 31  || zSql[nBytes-1
4e00: 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 63 68 61  ]!=0) ){.    cha
4e10: 72 20 2a 7a 53 71 6c 43 6f 70 79 3b 0a 20 20 20  r *zSqlCopy;.   
4e20: 20 69 6e 74 20 6d 78 4c 65 6e 20 3d 20 64 62 2d   int mxLen = db-
4e30: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4e40: 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
4e50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
4e60: 6e 42 79 74 65 73 3d 3d 6d 78 4c 65 6e 20 29 3b  nBytes==mxLen );
4e70: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
4e80: 42 79 74 65 73 3d 3d 6d 78 4c 65 6e 2b 31 20 29  Bytes==mxLen+1 )
4e90: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 73  ;.    if( nBytes
4ea0: 3e 6d 78 4c 65 6e 20 29 7b 0a 20 20 20 20 20 20  >mxLen ){.      
4eb0: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
4ec0: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  Msg(db, SQLITE_T
4ed0: 4f 4f 42 49 47 2c 20 22 73 74 61 74 65 6d 65 6e  OOBIG, "statemen
4ee0: 74 20 74 6f 6f 20 6c 6f 6e 67 22 29 3b 0a 20 20  t too long");.  
4ef0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f00: 41 70 69 45 78 69 74 28 64 62 2c 20 53 51 4c 49  ApiExit(db, SQLI
4f10: 54 45 5f 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20  TE_TOOBIG);.    
4f20: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70 61    goto end_prepa
4f30: 72 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  re;.    }.    zS
4f40: 71 6c 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33  qlCopy = sqlite3
4f50: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 53  DbStrNDup(db, zS
4f60: 71 6c 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20  ql, nBytes);.   
4f70: 20 69 66 28 20 7a 53 71 6c 43 6f 70 79 20 29 7b   if( zSqlCopy ){
4f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 75  .      sqlite3Ru
4f90: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
4fa0: 7a 53 71 6c 43 6f 70 79 2c 20 26 7a 45 72 72 4d  zSqlCopy, &zErrM
4fb0: 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
4fc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
4fd0: 6c 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 50  lCopy);.      pP
4fe0: 61 72 73 65 2d 3e 7a 54 61 69 6c 20 3d 20 26 7a  arse->zTail = &z
4ff0: 53 71 6c 5b 70 50 61 72 73 65 2d 3e 7a 54 61 69  Sql[pParse->zTai
5000: 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b 0a 20 20 20  l-zSqlCopy];.   
5010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
5020: 61 72 73 65 2d 3e 7a 54 61 69 6c 20 3d 20 26 7a  arse->zTail = &z
5030: 53 71 6c 5b 6e 42 79 74 65 73 5d 3b 0a 20 20 20  Sql[nBytes];.   
5040: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5050: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
5060: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
5070: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
5080: 61 73 73 65 72 74 28 20 30 3d 3d 70 50 61 72 73  assert( 0==pPars
5090: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 29 3b  e->nQueryLoop );
50a0: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
50b0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
50c0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
50d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
50e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
50f0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 70  =SQLITE_DONE ) p
5100: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
5110: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
5120: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
5130: 20 29 7b 0a 20 20 20 20 73 63 68 65 6d 61 49 73   ){.    schemaIs
5140: 56 61 6c 69 64 28 70 50 61 72 73 65 29 3b 0a 20  Valid(pParse);. 
5150: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
5160: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
5170: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
5180: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5190: 20 20 69 66 28 20 70 7a 54 61 69 6c 20 29 7b 0a    if( pzTail ){.
51a0: 20 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20 70 50      *pzTail = pP
51b0: 61 72 73 65 2d 3e 7a 54 61 69 6c 3b 0a 20 20 7d  arse->zTail;.  }
51c0: 0a 20 20 72 63 20 3d 20 70 50 61 72 73 65 2d 3e  .  rc = pParse->
51d0: 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
51e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
51f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5200: 45 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e  E_OK && pParse->
5210: 70 56 64 62 65 20 26 26 20 70 50 61 72 73 65 2d  pVdbe && pParse-
5220: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
5230: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5240: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 43 6f 6c 4e  r * const azColN
5250: 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
5260: 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
5270: 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22  ", "p1", "p2", "
5280: 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c  p3", "p4", "p5",
5290: 20 22 63 6f 6d 6d 65 6e 74 22 2c 0a 20 20 20 20   "comment",.    
52a0: 20 20 20 22 73 65 6c 65 63 74 69 64 22 2c 20 22     "selectid", "
52b0: 6f 72 64 65 72 22 2c 20 22 66 72 6f 6d 22 2c 20  order", "from", 
52c0: 22 64 65 74 61 69 6c 22 0a 20 20 20 20 7d 3b 0a  "detail".    };.
52d0: 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20      int iFirst, 
52e0: 6d 78 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  mx;.    if( pPar
52f0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
5300: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5310: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 70 50  dbeSetNumCols(pP
5320: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 34 29 3b  arse->pVdbe, 4);
5330: 0a 20 20 20 20 20 20 69 46 69 72 73 74 20 3d 20  .      iFirst = 
5340: 38 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20 31 32  8;.      mx = 12
5350: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5370: 74 4e 75 6d 43 6f 6c 73 28 70 50 61 72 73 65 2d  tNumCols(pParse-
5380: 3e 70 56 64 62 65 2c 20 38 29 3b 0a 20 20 20 20  >pVdbe, 8);.    
5390: 20 20 69 46 69 72 73 74 20 3d 20 30 3b 0a 20 20    iFirst = 0;.  
53a0: 20 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20 20 20      mx = 8;.    
53b0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 46 69 72  }.    for(i=iFir
53c0: 73 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  st; i<mx; i++){.
53d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
53e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 70 50 61 72  eSetColName(pPar
53f0: 73 65 2d 3e 70 56 64 62 65 2c 20 69 2d 69 46 69  se->pVdbe, i-iFi
5400: 72 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  rst, COLNAME_NAM
5410: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5430: 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c  zColName[i], SQL
5440: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
5450: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
5460: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
5470: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  sy==0 ){.    Vdb
5480: 65 20 2a 70 56 64 62 65 20 3d 20 70 50 61 72 73  e *pVdbe = pPars
5490: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71  e->pVdbe;.    sq
54a0: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
54b0: 70 56 64 62 65 2c 20 7a 53 71 6c 2c 20 28 69 6e  pVdbe, zSql, (in
54c0: 74 29 28 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c  t)(pParse->zTail
54d0: 2d 7a 53 71 6c 29 2c 20 73 61 76 65 53 71 6c 46  -zSql), saveSqlF
54e0: 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lag);.  }.  if( 
54f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 26 26  pParse->pVdbe &&
5500: 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc!=SQLITE_OK 
5510: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
5520: 6c 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  led) ){.    sqli
5530: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
5540: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a  pParse->pVdbe);.
5550: 20 20 20 20 61 73 73 65 72 74 28 21 28 2a 70 70      assert(!(*pp
5560: 53 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Stmt));.  }else{
5570: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  .    *ppStmt = (
5580: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 50  sqlite3_stmt*)pP
5590: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d  arse->pVdbe;.  }
55a0: 0a 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ..  if( zErrMsg 
55b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
55c0: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
55d0: 63 2c 20 22 25 73 22 2c 20 7a 45 72 72 4d 73 67  c, "%s", zErrMsg
55e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
55f0: 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
5600: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5610: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
5620: 20 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   rc);.  }..  /* 
5630: 44 65 6c 65 74 65 20 61 6e 79 20 54 72 69 67 67  Delete any Trigg
5640: 65 72 50 72 67 20 73 74 72 75 63 74 75 72 65 73  erPrg structures
5650: 20 61 6c 6c 6f 63 61 74 65 64 20 77 68 69 6c 65   allocated while
5660: 20 70 61 72 73 69 6e 67 20 74 68 69 73 20 73 74   parsing this st
5670: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 77 68  atement. */.  wh
5680: 69 6c 65 28 20 70 50 61 72 73 65 2d 3e 70 54 72  ile( pParse->pTr
5690: 69 67 67 65 72 50 72 67 20 29 7b 0a 20 20 20 20  iggerPrg ){.    
56a0: 54 72 69 67 67 65 72 50 72 67 20 2a 70 54 20 3d  TriggerPrg *pT =
56b0: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
56c0: 72 50 72 67 3b 0a 20 20 20 20 70 50 61 72 73 65  rPrg;.    pParse
56d0: 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20 3d 20  ->pTriggerPrg = 
56e0: 70 54 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  pT->pNext;.    s
56f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5700: 20 70 54 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70   pT);.  }..end_p
5710: 72 65 70 61 72 65 3a 0a 0a 20 20 73 71 6c 69 74  repare:..  sqlit
5720: 65 33 50 61 72 73 65 72 52 65 73 65 74 28 70 50  e3ParserReset(pP
5730: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
5740: 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 50  StackFree(db, pP
5750: 61 72 73 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  arse);.  rc = sq
5760: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
5770: 20 72 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20   rc);.  assert( 
5780: 28 72 63 26 64 62 2d 3e 65 72 72 4d 61 73 6b 29  (rc&db->errMask)
5790: 3d 3d 72 63 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==rc );.  return
57a0: 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e   rc;.}.static in
57b0: 74 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64  t sqlite3LockAnd
57c0: 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Prepare(.  sqlit
57d0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
57e0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
57f0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f   handle. */.  co
5800: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
5810: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38          /* UTF-8
5820: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
5830: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  tement. */.  int
5840: 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20   nBytes,        
5850: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
5860: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
5870: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  s. */.  int save
5880: 53 71 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 20  SqlFlag,        
5890: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f 70    /* True to cop
58a0: 79 20 53 51 4c 20 74 65 78 74 20 69 6e 74 6f 20  y SQL text into 
58b0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  the sqlite3_stmt
58c0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70 4f 6c 64   */.  Vdbe *pOld
58d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
58e0: 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65 70 72  /* VM being repr
58f0: 65 70 61 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  epared */.  sqli
5900: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
5910: 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20  t,    /* OUT: A 
5920: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
5930: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
5940: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
5950: 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20  r **pzTail      
5960: 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20   /* OUT: End of 
5970: 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f  parsed string */
5980: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
5990: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
59a0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
59b0: 69 66 28 20 70 70 53 74 6d 74 3d 3d 30 20 29 20  if( ppStmt==0 ) 
59c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
59d0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
59e0: 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  f.  *ppStmt = 0;
59f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
5a00: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
5a10: 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ||zSql==0 ){.   
5a20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
5a30: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
5a40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5a50: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
5a60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
5a70: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
5a80: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70  rc = sqlite3Prep
5a90: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42  are(db, zSql, nB
5aa0: 79 74 65 73 2c 20 73 61 76 65 53 71 6c 46 6c 61  ytes, saveSqlFla
5ab0: 67 2c 20 70 4f 6c 64 2c 20 70 70 53 74 6d 74 2c  g, pOld, ppStmt,
5ac0: 20 70 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20   pzTail);.  if( 
5ad0: 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  rc==SQLITE_SCHEM
5ae0: 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  A ){.    sqlite3
5af0: 5f 66 69 6e 61 6c 69 7a 65 28 2a 70 70 53 74 6d  _finalize(*ppStm
5b00: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
5b10: 69 74 65 33 50 72 65 70 61 72 65 28 64 62 2c 20  ite3Prepare(db, 
5b20: 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 73 61  zSql, nBytes, sa
5b30: 76 65 53 71 6c 46 6c 61 67 2c 20 70 4f 6c 64 2c  veSqlFlag, pOld,
5b40: 20 70 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c 29   ppStmt, pzTail)
5b50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
5b60: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
5b70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
5b80: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
5b90: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  x);.  assert( rc
5ba0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a  ==SQLITE_OK || *
5bb0: 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 72  ppStmt==0 );.  r
5bc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5bd0: 2a 2a 20 52 65 72 75 6e 20 74 68 65 20 63 6f 6d  ** Rerun the com
5be0: 70 69 6c 61 74 69 6f 6e 20 6f 66 20 61 20 73 74  pilation of a st
5bf0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 61 20  atement after a 
5c00: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e 0a 2a  schema change..*
5c10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 61 74  *.** If the stat
5c20: 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73 73  ement is success
5c30: 66 75 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64  fully recompiled
5c40: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5c50: 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  OK. Otherwise,.*
5c60: 2a 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  * if the stateme
5c70: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 63  nt cannot be rec
5c80: 6f 6d 70 69 6c 65 64 20 62 65 63 61 75 73 65 20  ompiled because 
5c90: 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
5ca0: 6f 6e 20 68 61 73 0a 2a 2a 20 6c 6f 63 6b 65 64  on has.** locked
5cb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 73   the sqlite3_mas
5cc0: 74 65 72 20 74 61 62 6c 65 2c 20 72 65 74 75 72  ter table, retur
5cd0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
5ce0: 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20 65 72   If any other er
5cf0: 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  ror.** occurs, r
5d00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 43 48  eturn SQLITE_SCH
5d10: 45 4d 41 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  EMA..*/.int sqli
5d20: 74 65 33 52 65 70 72 65 70 61 72 65 28 56 64 62  te3Reprepare(Vdb
5d30: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
5d40: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5d50: 2a 70 4e 65 77 3b 0a 20 20 63 6f 6e 73 74 20 63  *pNew;.  const c
5d60: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c  har *zSql;.  sql
5d70: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73  ite3 *db;..  ass
5d80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5d90: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 56  ex_held(sqlite3V
5da0: 64 62 65 44 62 28 70 29 2d 3e 6d 75 74 65 78 29  dbeDb(p)->mutex)
5db0: 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c   );.  zSql = sql
5dc0: 69 74 65 33 5f 73 71 6c 28 28 73 71 6c 69 74 65  ite3_sql((sqlite
5dd0: 33 5f 73 74 6d 74 20 2a 29 70 29 3b 0a 20 20 61  3_stmt *)p);.  a
5de0: 73 73 65 72 74 28 20 7a 53 71 6c 21 3d 30 20 29  ssert( zSql!=0 )
5df0: 3b 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20  ;  /* Reprepare 
5e00: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
5e10: 70 72 65 70 61 72 65 5f 76 32 28 29 20 73 74 61  prepare_v2() sta
5e20: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 64 62 20  tements */.  db 
5e30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  = sqlite3VdbeDb(
5e40: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p);.  assert( sq
5e50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5e60: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
5e70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63   rc = sqlite3Loc
5e80: 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 20  kAndPrepare(db, 
5e90: 7a 53 71 6c 2c 20 2d 31 2c 20 30 2c 20 70 2c 20  zSql, -1, 0, p, 
5ea0: 26 70 4e 65 77 2c 20 30 29 3b 0a 20 20 69 66 28  &pNew, 0);.  if(
5eb0: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
5ec0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
5ed0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
5ee0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
5ef0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
5f00: 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20   pNew==0 );.    
5f10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c  return rc;.  }el
5f20: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5f30: 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 7d 0a 20  pNew!=0 );.  }. 
5f40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70   sqlite3VdbeSwap
5f50: 28 28 56 64 62 65 2a 29 70 4e 65 77 2c 20 70 29  ((Vdbe*)pNew, p)
5f60: 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 61 6e 73  ;.  sqlite3Trans
5f70: 66 65 72 42 69 6e 64 69 6e 67 73 28 70 4e 65 77  ferBindings(pNew
5f80: 2c 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  , (sqlite3_stmt*
5f90: 29 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  )p);.  sqlite3Vd
5fa0: 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
5fb0: 74 28 28 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a  t((Vdbe*)pNew);.
5fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e    sqlite3VdbeFin
5fd0: 61 6c 69 7a 65 28 28 56 64 62 65 2a 29 70 4e 65  alize((Vdbe*)pNe
5fe0: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  w);.  return SQL
5ff0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
6000: 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
6010: 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20 41  f the official A
6020: 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64 20  PI.  Legacy and 
6030: 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68 65  new use.  In the
6040: 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73 69   legacy.** versi
6050: 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  on, the original
6060: 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f 74   SQL text is not
6070: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70 72   saved in the pr
6080: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6090: 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61 20  .** and so if a 
60a0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f 63  schema change oc
60b0: 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43 48  curs, SQLITE_SCH
60c0: 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 20  EMA is returned 
60d0: 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74  by.** sqlite3_st
60e0: 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e 65  ep().  In the ne
60f0: 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f  w version, the o
6100: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
6110: 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a 20   is retained.** 
6120: 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  and the statemen
6130: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
6140: 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69 66  ly recompiled if
6150: 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e 67   an schema chang
6160: 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  e.** occurs..*/.
6170: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70  int sqlite3_prep
6180: 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
6190: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
61a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
61b0: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
61c0: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
61d0: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
61e0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
61f0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
6200: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
6210: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6220: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
6230: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
6240: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
6250: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
6260: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
6270: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
6280: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
6290: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
62a0: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
62b0: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
62c0: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
62d0: 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61  ite3LockAndPrepa
62e0: 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  re(db,zSql,nByte
62f0: 73 2c 30 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54  s,0,0,ppStmt,pzT
6300: 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ail);.  assert( 
6310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
6320: 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70   ppStmt==0 || *p
6330: 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  pStmt==0 );  /* 
6340: 56 45 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a  VERIFY: F13021 *
6350: 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
6360: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  .int sqlite3_pre
6370: 70 61 72 65 5f 76 32 28 0a 20 20 73 71 6c 69 74  pare_v2(.  sqlit
6380: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6390: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
63a0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f   handle. */.  co
63b0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
63c0: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38          /* UTF-8
63d0: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
63e0: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  tement. */.  int
63f0: 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20   nBytes,        
6400: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
6410: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
6420: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
6430: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
6440: 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e    /* OUT: A poin
6450: 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61  ter to the prepa
6460: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
6470: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
6480: 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20  pzTail       /* 
6490: 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73  OUT: End of pars
64a0: 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ed string */.){.
64b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
64c0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50   sqlite3LockAndP
64d0: 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e  repare(db,zSql,n
64e0: 42 79 74 65 73 2c 31 2c 30 2c 70 70 53 74 6d 74  Bytes,1,0,ppStmt
64f0: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
6500: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
6510: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
6520: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
6530: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
6540: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
6550: 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  c;.}...#ifndef S
6560: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
6570: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74  ./*.** Compile t
6580: 68 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  he UTF-16 encode
6590: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  d SQL statement 
65a0: 7a 53 71 6c 20 69 6e 74 6f 20 61 20 73 74 61 74  zSql into a stat
65b0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
65c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
65d0: 74 65 33 50 72 65 70 61 72 65 31 36 28 0a 20 20  te3Prepare16(.  
65e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
65f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
6600: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f  abase handle. */
6610: 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
6620: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  zSql,         /*
6630: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
6640: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  SQL statement. *
6650: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20  /.  int nBytes, 
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6670: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20   Length of zSql 
6680: 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69  in bytes. */.  i
6690: 6e 74 20 73 61 76 65 53 71 6c 46 6c 61 67 2c 20  nt saveSqlFlag, 
66a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
66b0: 20 74 6f 20 73 61 76 65 20 53 51 4c 20 74 65 78   to save SQL tex
66c0: 74 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74  t into the sqlit
66d0: 65 33 5f 73 74 6d 74 20 2a 2f 0a 20 20 73 71 6c  e3_stmt */.  sql
66e0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
66f0: 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41  mt,    /* OUT: A
6700: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6710: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
6720: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  nt */.  const vo
6730: 69 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20  id **pzTail     
6740: 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66    /* OUT: End of
6750: 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a   parsed string *
6760: 2f 0a 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 66  /.){.  /* This f
6770: 75 6e 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  unction currentl
6780: 79 20 77 6f 72 6b 73 20 62 79 20 66 69 72 73 74  y works by first
6790: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
67a0: 65 20 55 54 46 2d 31 36 0a 20 20 2a 2a 20 65 6e  e UTF-16.  ** en
67b0: 63 6f 64 65 64 20 73 74 72 69 6e 67 20 74 6f 20  coded string to 
67c0: 55 54 46 2d 38 2c 20 74 68 65 6e 20 69 6e 76 6f  UTF-8, then invo
67d0: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65  king sqlite3_pre
67e0: 70 61 72 65 28 29 2e 20 54 68 65 0a 20 20 2a 2a  pare(). The.  **
67f0: 20 74 72 69 63 6b 79 20 62 69 74 20 69 73 20 66   tricky bit is f
6800: 69 67 75 72 69 6e 67 20 6f 75 74 20 74 68 65 20  iguring out the 
6810: 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72  pointer to retur
6820: 6e 20 69 6e 20 2a 70 7a 54 61 69 6c 2e 0a 20 20  n in *pzTail..  
6830: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 38  */.  char *zSql8
6840: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6850: 7a 54 61 69 6c 38 20 3d 20 30 3b 0a 20 20 69 6e  zTail8 = 0;.  in
6860: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6870: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6880: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
6890: 52 0a 20 20 69 66 28 20 70 70 53 74 6d 74 3d 3d  R.  if( ppStmt==
68a0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
68b0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
68c0: 65 6e 64 69 66 0a 20 20 2a 70 70 53 74 6d 74 20  endif.  *ppStmt 
68d0: 3d 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  = 0;.  if( !sqli
68e0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
68f0: 28 64 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b  (db)||zSql==0 ){
6900: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6910: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
6920: 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 73    }.  if( nBytes
6930: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  >=0 ){.    int s
6940: 7a 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  z;.    const cha
6950: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
6960: 61 72 2a 29 7a 53 71 6c 3b 0a 20 20 20 20 66 6f  ar*)zSql;.    fo
6970: 72 28 73 7a 3d 30 3b 20 73 7a 3c 6e 42 79 74 65  r(sz=0; sz<nByte
6980: 73 20 26 26 20 28 7a 5b 73 7a 5d 21 3d 30 20 7c  s && (z[sz]!=0 |
6990: 7c 20 7a 5b 73 7a 2b 31 5d 21 3d 30 29 3b 20 73  | z[sz+1]!=0); s
69a0: 7a 20 2b 3d 20 32 29 7b 7d 0a 20 20 20 20 6e 42  z += 2){}.    nB
69b0: 79 74 65 73 20 3d 20 73 7a 3b 0a 20 20 7d 0a 20  ytes = sz;.  }. 
69c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
69d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
69e0: 0a 20 20 7a 53 71 6c 38 20 3d 20 73 71 6c 69 74  .  zSql8 = sqlit
69f0: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
6a00: 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 53 51 4c  Sql, nBytes, SQL
6a10: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
6a20: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 38 20 29 7b  ;.  if( zSql8 ){
6a30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6a40: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28  3LockAndPrepare(
6a50: 64 62 2c 20 7a 53 71 6c 38 2c 20 2d 31 2c 20 73  db, zSql8, -1, s
6a60: 61 76 65 53 71 6c 46 6c 61 67 2c 20 30 2c 20 70  aveSqlFlag, 0, p
6a70: 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 38 29 3b  pStmt, &zTail8);
6a80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
6a90: 6c 38 20 26 26 20 70 7a 54 61 69 6c 20 29 7b 0a  l8 && pzTail ){.
6aa0: 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
6ab0: 33 5f 70 72 65 70 61 72 65 20 72 65 74 75 72 6e  3_prepare return
6ac0: 73 20 61 20 74 61 69 6c 20 70 6f 69 6e 74 65 72  s a tail pointer
6ad0: 2c 20 77 65 20 63 61 6c 63 75 6c 61 74 65 20 74  , we calculate t
6ae0: 68 65 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  he.    ** equiva
6af0: 6c 65 6e 74 20 70 6f 69 6e 74 65 72 20 69 6e 74  lent pointer int
6b00: 6f 20 74 68 65 20 55 54 46 2d 31 36 20 73 74 72  o the UTF-16 str
6b10: 69 6e 67 20 62 79 20 63 6f 75 6e 74 69 6e 67 20  ing by counting 
6b20: 74 68 65 20 75 6e 69 63 6f 64 65 0a 20 20 20 20  the unicode.    
6b30: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 62 65  ** characters be
6b40: 74 77 65 65 6e 20 7a 53 71 6c 38 20 61 6e 64 20  tween zSql8 and 
6b50: 7a 54 61 69 6c 38 2c 20 61 6e 64 20 74 68 65 6e  zTail8, and then
6b60: 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
6b70: 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20  nter.    ** the 
6b80: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63  same number of c
6b90: 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 74  haracters into t
6ba0: 68 65 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  he UTF-16 string
6bb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
6bc0: 20 63 68 61 72 73 5f 70 61 72 73 65 64 20 3d 20   chars_parsed = 
6bd0: 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
6be0: 65 6e 28 7a 53 71 6c 38 2c 20 28 69 6e 74 29 28  en(zSql8, (int)(
6bf0: 7a 54 61 69 6c 38 2d 7a 53 71 6c 38 29 29 3b 0a  zTail8-zSql8));.
6c00: 20 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20 28 75      *pzTail = (u
6c10: 38 20 2a 29 7a 53 71 6c 20 2b 20 73 71 6c 69 74  8 *)zSql + sqlit
6c20: 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a  e3Utf16ByteLen(z
6c30: 53 71 6c 2c 20 63 68 61 72 73 5f 70 61 72 73 65  Sql, chars_parse
6c40: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
6c50: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
6c60: 38 29 3b 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  8); .  rc = sqli
6c70: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
6c80: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
6c90: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6ca0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
6cb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  c;.}../*.** Two 
6cc0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
6cd0: 6f 66 66 69 63 69 61 6c 20 41 50 49 2e 20 20 4c  official API.  L
6ce0: 65 67 61 63 79 20 61 6e 64 20 6e 65 77 20 75 73  egacy and new us
6cf0: 65 2e 20 20 49 6e 20 74 68 65 20 6c 65 67 61 63  e.  In the legac
6d00: 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 74 68  y.** version, th
6d10: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
6d20: 65 78 74 20 69 73 20 6e 6f 74 20 73 61 76 65 64  ext is not saved
6d30: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
6d40: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
6d50: 64 20 73 6f 20 69 66 20 61 20 73 63 68 65 6d 61  d so if a schema
6d60: 20 63 68 61 6e 67 65 20 6f 63 63 75 72 73 2c 20   change occurs, 
6d70: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 73  SQLITE_SCHEMA is
6d80: 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20   returned by.** 
6d90: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
6da0: 20 49 6e 20 74 68 65 20 6e 65 77 20 76 65 72 73   In the new vers
6db0: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
6dc0: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 72 65  l SQL text is re
6dd0: 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68  tained.** and th
6de0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  e statement is a
6df0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65 63  utomatically rec
6e00: 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e 20 73 63  ompiled if an sc
6e10: 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a 2a 20 6f  hema change.** o
6e20: 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
6e30: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28  lite3_prepare16(
6e40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e60: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
6e70: 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69   */ .  const voi
6e80: 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  d *zSql,        
6e90: 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   /* UTF-16 encod
6ea0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
6eb0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
6ec0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
6ed0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
6ee0: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
6ef0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6f00: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
6f10: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
6f20: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
6f30: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
6f40: 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61 69 6c  st void **pzTail
6f50: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
6f60: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
6f70: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
6f80: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
6f90: 65 33 50 72 65 70 61 72 65 31 36 28 64 62 2c 7a  e3Prepare16(db,z
6fa0: 53 71 6c 2c 6e 42 79 74 65 73 2c 30 2c 70 70 53  Sql,nBytes,0,ppS
6fb0: 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61  tmt,pzTail);.  a
6fc0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6fd0: 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d  E_OK || ppStmt==
6fe0: 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  0 || *ppStmt==0 
6ff0: 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46  );  /* VERIFY: F
7000: 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72  13021 */.  retur
7010: 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
7020: 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
7030: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7050: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
7060: 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f  . */ .  const vo
7070: 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  id *zSql,       
7080: 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f    /* UTF-16 enco
7090: 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ded SQL statemen
70a0: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  t. */.  int nByt
70b0: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  es,             
70c0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
70d0: 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f  Sql in bytes. */
70e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
70f0: 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20  **ppStmt,    /* 
7100: 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74  OUT: A pointer t
7110: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
7120: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
7130: 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61 69  nst void **pzTai
7140: 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  l       /* OUT: 
7150: 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74  End of parsed st
7160: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
7170: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
7180: 74 65 33 50 72 65 70 61 72 65 31 36 28 64 62 2c  te3Prepare16(db,
7190: 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 31 2c 70 70  zSql,nBytes,1,pp
71a0: 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20  Stmt,pzTail);.  
71b0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
71c0: 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d  TE_OK || ppStmt=
71d0: 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30  =0 || *ppStmt==0
71e0: 20 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20   );  /* VERIFY: 
71f0: 46 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75  F13021 */.  retu
7200: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
7210: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7220: 55 54 46 31 36 20 2a 2f 0a                       UTF16 */.