/ Hex Artifact Content
Login

Artifact 3e1c9aefe1bbb1efe6e07e2486acb8c2d5c533cb059b9be4fc7eaadc7303477a:


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 64 62 2d 3e 6d 61  db;.  if( db->ma
0380: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
0390: 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 53 51    pData->rc = SQ
03a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
03b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 61  .  }else if( pDa
03c0: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 5b 30 5d 21  ta->pzErrMsg[0]!
03d0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 65  =0 ){.    /* A e
03e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 61 73  rror message has
03f0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
0400: 6e 65 72 61 74 65 64 2e 20 20 44 6f 20 6e 6f 74  nerated.  Do not
0410: 20 6f 76 65 72 77 72 69 74 65 20 69 74 20 2a 2f   overwrite it */
0420: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 61  .  }else if( pDa
0430: 74 61 2d 3e 6d 49 6e 69 74 46 6c 61 67 73 20 26  ta->mInitFlags &
0440: 20 49 4e 49 54 46 4c 41 47 5f 41 6c 74 65 72 54   INITFLAG_AlterT
0450: 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a 70 44 61  able ){.    *pDa
0460: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 20 3d 20 73  ta->pzErrMsg = s
0470: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
0480: 62 2c 20 7a 45 78 74 72 61 29 3b 0a 20 20 20 20  b, zExtra);.    
0490: 70 44 61 74 61 2d 3e 72 63 20 3d 20 53 51 4c 49  pData->rc = SQLI
04a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
04b0: 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20  e if( db->flags 
04c0: 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
04d0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 44 61 74  hema ){.    pDat
04e0: 61 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  a->rc = SQLITE_C
04f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
0500: 65 6c 73 65 20 69 66 28 20 49 73 52 65 75 73 65  else if( IsReuse
0510: 53 63 68 65 6d 61 28 64 62 29 20 0a 20 20 20 20  Schema(db) .    
0520: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
0530: 65 33 53 74 72 4e 49 43 6d 70 28 7a 45 78 74 72  e3StrNICmp(zExtr
0540: 61 2c 20 22 6d 61 6c 66 6f 72 6d 65 64 20 64 61  a, "malformed da
0550: 74 61 62 61 73 65 20 73 63 68 65 6d 61 22 2c 20  tabase schema", 
0560: 31 37 29 0a 20 20 29 7b 0a 20 20 20 20 70 44 61  17).  ){.    pDa
0570: 74 61 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  ta->rc = SQLITE_
0580: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
0590: 20 20 2a 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d    *pData->pzErrM
05a0: 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
05b0: 72 44 75 70 28 64 62 2c 20 7a 45 78 74 72 61 29  rDup(db, zExtra)
05c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
05d0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
05e0: 7a 4f 62 6a 3d 3d 30 20 29 20 7a 4f 62 6a 20 3d  zObj==0 ) zObj =
05f0: 20 22 3f 22 3b 0a 20 20 20 20 7a 20 3d 20 73 71   "?";.    z = sq
0600: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
0610: 20 22 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61   "malformed data
0620: 62 61 73 65 20 73 63 68 65 6d 61 20 28 25 73 29  base schema (%s)
0630: 22 2c 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 69 66  ", zObj);.    if
0640: 28 20 7a 45 78 74 72 61 20 26 26 20 7a 45 78 74  ( zExtra && zExt
0650: 72 61 5b 30 5d 20 29 20 7a 20 3d 20 73 71 6c 69  ra[0] ) z = sqli
0660: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
0670: 25 7a 20 2d 20 25 73 22 2c 20 7a 2c 20 7a 45 78  %z - %s", z, zEx
0680: 74 72 61 29 3b 0a 20 20 20 20 2a 70 44 61 74 61  tra);.    *pData
0690: 2d 3e 70 7a 45 72 72 4d 73 67 20 3d 20 7a 3b 0a  ->pzErrMsg = z;.
06a0: 20 20 20 20 70 44 61 74 61 2d 3e 72 63 20 3d 20      pData->rc = 
06b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
06c0: 4b 50 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  KPT;.  }.}../*.*
06d0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 53 63 68  * Update the Sch
06e0: 65 6d 61 2e 63 6b 73 75 6d 20 63 68 65 63 6b 73  ema.cksum checks
06f0: 75 6d 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  um to account fo
0700: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  r the database o
0710: 62 6a 65 63 74 0a 2a 2a 20 73 70 65 63 69 66 69  bject.** specifi
0720: 65 64 20 62 79 20 74 68 65 20 74 68 72 65 65 20  ed by the three 
0730: 61 72 67 75 6d 65 6e 74 73 20 66 6f 6c 6c 6f 77  arguments follow
0740: 69 6e 67 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  ing the first..*
0750: 2f 0a 76 6f 69 64 20 73 63 68 65 6d 61 55 70 64  /.void schemaUpd
0760: 61 74 65 43 68 65 63 6b 73 75 6d 28 0a 20 20 49  ateChecksum(.  I
0770: 6e 69 74 44 61 74 61 20 2a 70 44 61 74 61 2c 20  nitData *pData, 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0790: 2a 20 53 63 68 65 6d 61 20 70 61 72 73 65 20 63  * Schema parse c
07a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
07b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
07d0: 61 6d 65 20 6f 66 20 6e 65 77 20 64 61 74 61 62  ame of new datab
07e0: 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ase object */.  
07f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f  const char *zRoo
0800: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
0820: 6e 65 77 20 64 61 74 61 62 61 73 65 20 6f 62 6a  new database obj
0830: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
0840: 68 61 72 20 2a 7a 53 71 6c 20 20 20 20 20 20 20  har *zSql       
0850: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
0860: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 6e  used to create n
0870: 65 77 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65  ew database obje
0880: 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ct */.){.  int i
0890: 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20  ;.  u64 cksum = 
08a0: 70 44 61 74 61 2d 3e 63 6b 73 75 6d 3b 0a 20 20  pData->cksum;.  
08b0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
08c0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
08d0: 69 5d 3b 20 69 2b 2b 29 20 63 6b 73 75 6d 20 2b  i]; i++) cksum +
08e0: 3d 20 28 63 6b 73 75 6d 3c 3c 33 29 20 2b 20 7a  = (cksum<<3) + z
08f0: 4e 61 6d 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  Name[i];.  }.  i
0900: 66 28 20 7a 52 6f 6f 74 20 29 20 66 6f 72 28 69  f( zRoot ) for(i
0910: 3d 30 3b 20 7a 52 6f 6f 74 5b 69 5d 3b 20 69 2b  =0; zRoot[i]; i+
0920: 2b 29 20 63 6b 73 75 6d 20 2b 3d 20 28 63 6b 73  +) cksum += (cks
0930: 75 6d 3c 3c 33 29 20 2b 20 7a 52 6f 6f 74 5b 69  um<<3) + zRoot[i
0940: 5d 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 20  ];.  if( zSql ) 
0950: 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c 5b 69 5d  for(i=0; zSql[i]
0960: 3b 20 69 2b 2b 29 20 63 6b 73 75 6d 20 2b 3d 20  ; i++) cksum += 
0970: 28 63 6b 73 75 6d 3c 3c 33 29 20 2b 20 7a 53 71  (cksum<<3) + zSq
0980: 6c 5b 69 5d 3b 0a 20 20 70 44 61 74 61 2d 3e 63  l[i];.  pData->c
0990: 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 7d 0a  ksum = cksum;.}.
09a0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
09b0: 73 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  see if any sibli
09c0: 6e 67 20 69 6e 64 65 78 20 28 61 6e 6f 74 68 65  ng index (anothe
09d0: 72 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 73  r index on the s
09e0: 61 6d 65 20 74 61 62 6c 65 29 0a 2a 2a 20 6f 66  ame table).** of
09f0: 20 70 49 6e 64 65 78 20 68 61 73 20 74 68 65 20   pIndex has the 
0a00: 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
0a10: 75 6d 62 65 72 2c 20 61 6e 64 20 69 66 20 69 74  umber, and if it
0a20: 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 20 74 72   does, return tr
0a30: 75 65 2e 0a 2a 2a 20 54 68 69 73 20 77 6f 75 6c  ue..** This woul
0a40: 64 20 69 6e 64 69 63 61 74 65 20 61 20 63 6f 72  d indicate a cor
0a50: 72 75 70 74 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  rupt schema..*/.
0a60: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
0a70: 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74  HasDuplicateRoot
0a80: 50 61 67 65 28 49 6e 64 65 78 20 2a 70 49 6e 64  Page(Index *pInd
0a90: 65 78 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ex){.  Index *p;
0aa0: 0a 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d  .  for(p=pIndex-
0ab0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
0ac0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
0ad0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d  .    if( p->tnum
0ae0: 3d 3d 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 26  ==pIndex->tnum &
0af0: 26 20 70 21 3d 70 49 6e 64 65 78 20 29 20 72 65  & p!=pIndex ) re
0b00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
0b10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0b20: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
0b30: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f  lback routine fo
0b40: 72 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  r the code that 
0b50: 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 0a  initializes the.
0b60: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  ** database.  Se
0b70: 65 20 73 71 6c 69 74 65 33 49 6e 69 74 28 29 20  e sqlite3Init() 
0b80: 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
0b90: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
0ba0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
0bb0: 65 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  e is also called
0bc0: 20 66 72 6f 6d 20 74 68 65 20 4f 50 5f 50 61 72   from the OP_Par
0bd0: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 20  seSchema opcode 
0be0: 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a  of the VDBE..**.
0bf0: 2a 2a 20 45 61 63 68 20 63 61 6c 6c 62 61 63 6b  ** Each callback
0c00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f   contains the fo
0c10: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
0c20: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61  ion:.**.**     a
0c30: 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66  rgv[0] = name of
0c40: 20 74 68 69 6e 67 20 62 65 69 6e 67 20 63 72 65   thing being cre
0c50: 61 74 65 64 0a 2a 2a 20 20 20 20 20 61 72 67 76  ated.**     argv
0c60: 5b 31 5d 20 3d 20 72 6f 6f 74 20 70 61 67 65 20  [1] = root page 
0c70: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
0c80: 20 6f 72 20 69 6e 64 65 78 2e 20 30 20 66 6f 72   or index. 0 for
0c90: 20 74 72 69 67 67 65 72 20 6f 72 20 76 69 65 77   trigger or view
0ca0: 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d  ..**     argv[2]
0cb0: 20 3d 20 53 51 4c 20 74 65 78 74 20 66 6f 72 20   = SQL text for 
0cc0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
0cd0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  ment..**.*/.int 
0ce0: 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62  sqlite3InitCallb
0cf0: 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74 2c  ack(void *pInit,
0d00: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
0d10: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
0d20: 6f 74 55 73 65 64 29 7b 0a 20 20 49 6e 69 74 44  otUsed){.  InitD
0d30: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 49 6e  ata *pData = (In
0d40: 69 74 44 61 74 61 2a 29 70 49 6e 69 74 3b 0a 20  itData*)pInit;. 
0d50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0d60: 44 61 74 61 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  Data->db;.  int 
0d70: 69 44 62 20 3d 20 70 44 61 74 61 2d 3e 69 44 62  iDb = pData->iDb
0d80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
0d90: 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==3 );.  UNUSED
0da0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
0db0: 73 65 64 2c 20 61 72 67 63 29 3b 0a 20 20 61 73  sed, argc);.  as
0dc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
0dd0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
0de0: 65 78 29 20 29 3b 0a 20 20 44 62 43 6c 65 61 72  ex) );.  DbClear
0df0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
0e00: 2c 20 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20 70  , DB_Empty);.  p
0e10: 44 61 74 61 2d 3e 6e 49 6e 69 74 52 6f 77 2b 2b  Data->nInitRow++
0e20: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
0e30: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0e40: 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28 70 44  corruptSchema(pD
0e50: 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29  ata, argv[0], 0)
0e60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
0e70: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
0e80: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
0e90: 3e 6e 44 62 20 29 3b 0a 20 20 69 66 28 20 61 72  >nDb );.  if( ar
0ea0: 67 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  gv==0 ) return 0
0eb0: 3b 20 20 20 2f 2a 20 4d 69 67 68 74 20 68 61 70  ;   /* Might hap
0ec0: 70 65 6e 20 69 66 20 45 4d 50 54 59 5f 52 45 53  pen if EMPTY_RES
0ed0: 55 4c 54 5f 43 41 4c 4c 42 41 43 4b 53 20 61 72  ULT_CALLBACKS ar
0ee0: 65 20 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 61 72  e on */.  if( ar
0ef0: 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  gv[1]==0 ){.    
0f00: 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28 70 44  corruptSchema(pD
0f10: 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29  ata, argv[0], 0)
0f20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
0f30: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61  lite3_strnicmp(a
0f40: 72 67 76 5b 32 5d 2c 22 63 72 65 61 74 65 20 22  rgv[2],"create "
0f50: 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ,7)==0 ){.    /*
0f60: 20 43 61 6c 6c 20 74 68 65 20 70 61 72 73 65 72   Call the parser
0f70: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 43 52   to process a CR
0f80: 45 41 54 45 20 54 41 42 4c 45 2c 20 49 4e 44 45  EATE TABLE, INDE
0f90: 58 20 6f 72 20 56 49 45 57 2e 0a 20 20 20 20 2a  X or VIEW..    *
0fa0: 2a 20 42 75 74 20 62 65 63 61 75 73 65 20 64 62  * But because db
0fb0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 73  ->init.busy is s
0fc0: 65 74 20 74 6f 20 31 2c 20 6e 6f 20 56 44 42 45  et to 1, no VDBE
0fd0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
0fe0: 65 64 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 65  ed.    ** or exe
0ff0: 63 75 74 65 64 2e 20 20 41 6c 6c 20 74 68 65 20  cuted.  All the 
1000: 70 61 72 73 65 72 20 64 6f 65 73 20 69 73 20 62  parser does is b
1010: 75 69 6c 64 20 74 68 65 20 69 6e 74 65 72 6e 61  uild the interna
1020: 6c 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 73 74  l data.    ** st
1030: 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65  ructures that de
1040: 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
1050: 2c 20 69 6e 64 65 78 2c 20 6f 72 20 76 69 65 77  , index, or view
1060: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1070: 20 72 63 3b 0a 20 20 20 20 75 38 20 73 61 76 65   rc;.    u8 save
1080: 64 5f 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74  d_iDb = db->init
1090: 2e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  .iDb;.    sqlite
10a0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
10b0: 20 20 20 54 45 53 54 4f 4e 4c 59 28 69 6e 74 20     TESTONLY(int 
10c0: 72 63 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  rcp);           
10d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10e0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 65  from sqlite3_pre
10f0: 70 61 72 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61  pare() */..    a
1100: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
1110: 62 75 73 79 20 29 3b 0a 20 20 20 20 64 62 2d 3e  busy );.    db->
1120: 69 6e 69 74 2e 69 44 62 20 3d 20 69 44 62 3b 0a  init.iDb = iDb;.
1130: 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77      db->init.new
1140: 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 41 74  Tnum = sqlite3At
1150: 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  oi(argv[1]);.   
1160: 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e   db->init.orphan
1170: 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20  Trigger = 0;.   
1180: 20 54 45 53 54 4f 4e 4c 59 28 72 63 70 20 3d 20   TESTONLY(rcp = 
1190: 29 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  ) sqlite3_prepar
11a0: 65 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d  e(db, argv[2], -
11b0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
11c0: 20 20 20 72 63 20 3d 20 64 62 2d 3e 65 72 72 43     rc = db->errC
11d0: 6f 64 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ode;.    assert(
11e0: 20 28 72 63 26 30 78 46 46 29 3d 3d 28 72 63 70   (rc&0xFF)==(rcp
11f0: 26 30 78 46 46 29 20 29 3b 0a 20 20 20 20 64 62  &0xFF) );.    db
1200: 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 61 76  ->init.iDb = sav
1210: 65 64 5f 69 44 62 3b 0a 20 20 20 20 2f 2a 20 61  ed_iDb;.    /* a
1220: 73 73 65 72 74 28 20 73 61 76 65 64 5f 69 44 62  ssert( saved_iDb
1230: 3d 3d 30 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46  ==0 || (db->mDbF
1240: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
1250: 63 75 75 6d 29 21 3d 30 20 29 3b 20 2a 2f 0a 20  cuum)!=0 ); */. 
1260: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1270: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  !=rc ){.      if
1280: 28 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61  ( db->init.orpha
1290: 6e 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  nTrigger ){.    
12a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
12b0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  =1 );.      }els
12c0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61  e{.        pData
12d0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
12e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12f0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
1300: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1310: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1320: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
1330: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
1340: 20 26 26 20 28 72 63 26 30 78 46 46 29 21 3d 53   && (rc&0xFF)!=S
1350: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
1360: 20 20 20 20 20 20 20 20 20 20 63 6f 72 72 75 70            corrup
1370: 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61  tSchema(pData, a
1380: 72 67 76 5b 30 5d 2c 20 73 71 6c 69 74 65 33 5f  rgv[0], sqlite3_
1390: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
13a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13c0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
13d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 72  ;.  }else if( ar
13e0: 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 28 61 72 67  gv[0]==0 || (arg
13f0: 76 5b 32 5d 21 3d 30 20 26 26 20 61 72 67 76 5b  v[2]!=0 && argv[
1400: 32 5d 5b 30 5d 21 3d 30 29 20 29 7b 0a 20 20 20  2][0]!=0) ){.   
1410: 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28 70   corruptSchema(p
1420: 44 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20 30  Data, argv[0], 0
1430: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1440: 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 20 63 6f  /* If the SQL co
1450: 6c 75 6d 6e 20 69 73 20 62 6c 61 6e 6b 20 69 74  lumn is blank it
1460: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 61   means this is a
1470: 6e 20 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20  n index that.   
1480: 20 2a 2a 20 77 61 73 20 63 72 65 61 74 65 64 20   ** was created 
1490: 74 6f 20 62 65 20 74 68 65 20 50 52 49 4d 41 52  to be the PRIMAR
14a0: 59 20 4b 45 59 20 6f 72 20 74 6f 20 66 75 6c 66  Y KEY or to fulf
14b0: 69 6c 6c 20 61 20 55 4e 49 51 55 45 0a 20 20 20  ill a UNIQUE.   
14c0: 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 66   ** constraint f
14d0: 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  or a CREATE TABL
14e0: 45 2e 20 20 54 68 65 20 69 6e 64 65 78 20 73 68  E.  The index sh
14f0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
1500: 79 0a 20 20 20 20 2a 2a 20 62 65 65 6e 20 63 72  y.    ** been cr
1510: 65 61 74 65 64 20 77 68 65 6e 20 77 65 20 70 72  eated when we pr
1520: 6f 63 65 73 73 65 64 20 74 68 65 20 43 52 45 41  ocessed the CREA
1530: 54 45 20 54 41 42 4c 45 2e 20 20 41 6c 6c 20 77  TE TABLE.  All w
1540: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
1550: 20 64 6f 20 68 65 72 65 20 69 73 20 72 65 63 6f   do here is reco
1560: 72 64 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  rd the root page
1570: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 61 74   number for that
1580: 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
1590: 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
15a0: 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73  ;.    pIndex = s
15b0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
15c0: 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 64 62 2d  db, argv[0], db-
15d0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
15e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  me);.    if( pIn
15f0: 64 65 78 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73  dex==0.     || s
1600: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 61  qlite3GetInt32(a
1610: 72 67 76 5b 31 5d 2c 26 70 49 6e 64 65 78 2d 3e  rgv[1],&pIndex->
1620: 74 6e 75 6d 29 3d 3d 30 0a 20 20 20 20 20 7c 7c  tnum)==0.     ||
1630: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3c 32 0a   pIndex->tnum<2.
1640: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 49       || sqlite3I
1650: 6e 64 65 78 48 61 73 44 75 70 6c 69 63 61 74 65  ndexHasDuplicate
1660: 52 6f 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29  RootPage(pIndex)
1670: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
1680: 72 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74  rruptSchema(pDat
1690: 61 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 64  a, argv[0], pInd
16a0: 65 78 3f 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74  ex?"invalid root
16b0: 70 61 67 65 22 3a 22 6f 72 70 68 61 6e 20 69 6e  page":"orphan in
16c0: 64 65 78 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  dex");.    }.  }
16d0: 0a 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 26  ..  if( iDb!=1 &
16e0: 26 20 28 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  & (db->openFlags
16f0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
1700: 48 41 52 45 44 5f 53 43 48 45 4d 41 29 20 29 7b  HARED_SCHEMA) ){
1710: 0a 20 20 20 20 73 63 68 65 6d 61 55 70 64 61 74  .    schemaUpdat
1720: 65 43 68 65 63 6b 73 75 6d 28 70 44 61 74 61 2c  eChecksum(pData,
1730: 20 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31   argv[0], argv[1
1740: 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d  ], argv[2]);.  }
1750: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1760: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1770: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1780: 73 65 20 73 63 68 65 6d 61 20 61 6e 64 20 69 6e  se schema and in
1790: 69 74 69 61 6c 69 7a 65 20 69 6e 74 65 72 6e 61  itialize interna
17a0: 6c 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  l.** data struct
17b0: 75 72 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ures for a singl
17c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17d0: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
17e0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
17f0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  ile is given by 
1800: 69 44 62 2e 20 20 69 44 62 3d 3d 30 20 69 73 20  iDb.  iDb==0 is 
1810: 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69  used for the mai
1820: 6e 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  n.** database.  
1830: 69 44 62 3d 3d 31 20 73 68 6f 75 6c 64 20 6e 65  iDb==1 should ne
1840: 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 69 44  ver be used.  iD
1850: 62 3e 3d 32 20 69 73 20 75 73 65 64 20 66 6f 72  b>=2 is used for
1860: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
1870: 74 61 62 61 73 65 73 2e 20 20 52 65 74 75 72 6e  tabases.  Return
1880: 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49   one of the SQLI
1890: 54 45 5f 20 65 72 72 6f 72 20 63 6f 64 65 73 20  TE_ error codes 
18a0: 74 6f 0a 2a 2a 20 69 6e 64 69 63 61 74 65 20 73  to.** indicate s
18b0: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
18c0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18d0: 33 49 6e 69 74 4f 6e 65 28 73 71 6c 69 74 65 33  3InitOne(sqlite3
18e0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
18f0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
1900: 75 33 32 20 6d 46 6c 61 67 73 29 7b 0a 20 20 69  u32 mFlags){.  i
1910: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a  nt rc;.  int i;.
1920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1930: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
1940: 20 69 6e 74 20 73 69 7a 65 3b 0a 23 65 6e 64 69   int size;.#endi
1950: 66 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 63  f.  Db *pDb;.  c
1960: 68 61 72 20 63 6f 6e 73 74 20 2a 61 7a 41 72 67  har const *azArg
1970: 5b 34 5d 3b 0a 20 20 69 6e 74 20 6d 65 74 61 5b  [4];.  int meta[
1980: 35 5d 3b 0a 20 20 49 6e 69 74 44 61 74 61 20 69  5];.  InitData i
1990: 6e 69 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  nitData;.  const
19a0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4e 61   char *zMasterNa
19b0: 6d 65 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 65 64  me;.  int opened
19c0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 3b  Transaction = 0;
19d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ..  assert( (db-
19e0: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
19f0: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
1a00: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
1a10: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
1a20: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
1a30: 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
1a40: 5d 2e 70 53 63 68 65 6d 61 20 7c 7c 20 28 49 73  ].pSchema || (Is
1a50: 52 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20  ReuseSchema(db) 
1a60: 26 26 20 69 44 62 21 3d 31 29 20 29 3b 0a 20 20  && iDb!=1) );.  
1a70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a80: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
1a90: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1aa0: 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c  t( iDb==1 || sql
1ab0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1ac0: 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  tex(db->aDb[iDb]
1ad0: 2e 70 42 74 29 20 29 3b 0a 0a 20 20 70 44 62 20  .pBt) );..  pDb 
1ae0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
1af0: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
1b00: 70 53 50 6f 6f 6c 3d 3d 30 20 7c 7c 20 49 73 52  pSPool==0 || IsR
1b10: 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20 29  euseSchema(db) )
1b20: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 50  ;.  if( pDb->pSP
1b30: 6f 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ool ){.    /* Se
1b40: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
1b50: 66 72 65 65 20 73 63 68 65 6d 61 20 6f 62 6a 65  free schema obje
1b60: 63 74 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ct in the schema
1b70: 2d 70 6f 6f 6c 2e 20 49 66 20 6e 6f 74 2c 0a 20  -pool. If not,. 
1b80: 20 20 20 2a 2a 20 64 69 73 63 6f 6e 6e 65 63 74     ** disconnect
1b90: 20 66 72 6f 6d 20 73 61 69 64 20 73 63 68 65 6d   from said schem
1ba0: 61 20 70 6f 6f 6c 20 61 6e 64 20 63 6f 6e 74 69  a pool and conti
1bb0: 6e 75 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  nue. This functi
1bc0: 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  on will.    ** c
1bd0: 6f 6e 6e 65 63 74 20 74 6f 20 61 20 28 70 6f 73  onnect to a (pos
1be0: 73 69 62 6c 79 20 64 69 66 66 65 72 65 6e 74 29  sibly different)
1bf0: 20 73 63 68 65 6d 61 2d 70 6f 6f 6c 20 62 65 66   schema-pool bef
1c00: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1c10: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 4e  /.    Schema *pN
1c20: 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ew = sqlite3Sche
1c30: 6d 61 45 78 74 72 61 63 74 28 70 44 62 2d 3e 70  maExtract(pDb->p
1c40: 53 50 6f 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  SPool);.    if( 
1c50: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 44  pNew ){.      pD
1c60: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4e 65  b->pSchema = pNe
1c70: 77 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  w;.      return 
1c80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c90: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ca0: 33 53 63 68 65 6d 61 44 69 73 63 6f 6e 6e 65 63  3SchemaDisconnec
1cb0: 74 28 64 62 2c 20 69 44 62 2c 20 31 29 3b 0a 20  t(db, iDb, 1);. 
1cc0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cd0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 72 72 6f  E_OK ) goto erro
1ce0: 72 5f 6f 75 74 3b 0a 20 20 20 20 61 73 73 65 72  r_out;.    asser
1cf0: 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  t( pDb->pSchema 
1d00: 26 26 20 70 44 62 2d 3e 70 53 50 6f 6f 6c 3d 3d  && pDb->pSPool==
1d10: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 64 62 2d 3e  0 );.  }..  db->
1d20: 69 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 0a  init.busy = 1;..
1d30: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
1d40: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
1d50: 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 63 68 65  resentation sche
1d60: 6d 61 20 74 61 62 6c 65 73 20 28 73 71 6c 69 74  ma tables (sqlit
1d70: 65 5f 6d 61 73 74 65 72 20 6f 72 0a 20 20 2a 2a  e_master or.  **
1d80: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
1d90: 74 65 72 29 20 62 79 20 69 6e 76 6f 6b 69 6e 67  ter) by invoking
1da0: 20 74 68 65 20 70 61 72 73 65 72 20 64 69 72 65   the parser dire
1db0: 63 74 6c 79 2e 20 20 54 68 65 20 61 70 70 72 6f  ctly.  The appro
1dc0: 70 72 69 61 74 65 0a 20 20 2a 2a 20 74 61 62 6c  priate.  ** tabl
1dd0: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 69  e name will be i
1de0: 6e 73 65 72 74 65 64 20 61 75 74 6f 6d 61 74 69  nserted automati
1df0: 63 61 6c 6c 79 20 62 79 20 74 68 65 20 70 61 72  cally by the par
1e00: 73 65 72 20 73 6f 20 77 65 20 63 61 6e 20 6a 75  ser so we can ju
1e10: 73 74 0a 20 20 2a 2a 20 75 73 65 20 74 68 65 20  st.  ** use the 
1e20: 61 62 62 72 65 76 69 61 74 69 6f 6e 20 22 78 22  abbreviation "x"
1e30: 20 68 65 72 65 2e 20 20 54 68 65 20 70 61 72 73   here.  The pars
1e40: 65 72 20 77 69 6c 6c 20 61 6c 73 6f 20 61 75 74  er will also aut
1e50: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 61 67 0a 20  omatically tag. 
1e60: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74   ** the schema t
1e70: 61 62 6c 65 20 61 73 20 72 65 61 64 2d 6f 6e 6c  able as read-onl
1e80: 79 2e 20 2a 2f 0a 20 20 61 7a 41 72 67 5b 30 5d  y. */.  azArg[0]
1e90: 20 3d 20 7a 4d 61 73 74 65 72 4e 61 6d 65 20 3d   = zMasterName =
1ea0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1eb0: 62 29 3b 0a 20 20 61 7a 41 72 67 5b 31 5d 20 3d  b);.  azArg[1] =
1ec0: 20 22 31 22 3b 0a 20 20 61 7a 41 72 67 5b 32 5d   "1";.  azArg[2]
1ed0: 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   = "CREATE TABLE
1ee0: 20 78 28 74 79 70 65 20 74 65 78 74 2c 6e 61 6d   x(type text,nam
1ef0: 65 20 74 65 78 74 2c 74 62 6c 5f 6e 61 6d 65 20  e text,tbl_name 
1f00: 74 65 78 74 2c 22 0a 20 20 20 20 20 20 20 20 20  text,".         
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 22 72 6f 6f 74 70 61 67 65 20 69 6e 74     "rootpage int
1f30: 2c 73 71 6c 20 74 65 78 74 29 22 3b 0a 20 20 61  ,sql text)";.  a
1f40: 7a 41 72 67 5b 33 5d 20 3d 20 30 3b 0a 20 20 69  zArg[3] = 0;.  i
1f50: 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b  nitData.db = db;
1f60: 0a 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20  .  initData.iDb 
1f70: 3d 20 69 44 62 3b 0a 20 20 69 6e 69 74 44 61 74  = iDb;.  initDat
1f80: 61 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  a.rc = SQLITE_OK
1f90: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45  ;.  initData.pzE
1fa0: 72 72 4d 73 67 20 3d 20 70 7a 45 72 72 4d 73 67  rrMsg = pzErrMsg
1fb0: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 6d 49 6e  ;.  initData.mIn
1fc0: 69 74 46 6c 61 67 73 20 3d 20 6d 46 6c 61 67 73  itFlags = mFlags
1fd0: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 6e 49 6e  ;.  initData.nIn
1fe0: 69 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 6e 69  itRow = 0;.  ini
1ff0: 74 44 61 74 61 2e 63 6b 73 75 6d 20 3d 20 30 3b  tData.cksum = 0;
2000: 0a 20 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61  .  sqlite3InitCa
2010: 6c 6c 62 61 63 6b 28 26 69 6e 69 74 44 61 74 61  llback(&initData
2020: 2c 20 33 2c 20 28 63 68 61 72 20 2a 2a 29 61 7a  , 3, (char **)az
2030: 41 72 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 69  Arg, 0);.  if( i
2040: 6e 69 74 44 61 74 61 2e 72 63 20 29 7b 0a 20 20  nitData.rc ){.  
2050: 20 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e    rc = initData.
2060: 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72  rc;.    goto err
2070: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
2080: 2a 20 43 72 65 61 74 65 20 61 20 63 75 72 73 6f  * Create a curso
2090: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64 61  r to hold the da
20a0: 74 61 62 61 73 65 20 6f 70 65 6e 0a 20 20 2a 2f  tabase open.  */
20b0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d  .  if( pDb->pBt=
20c0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
20d0: 28 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ( iDb==1 );.    
20e0: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
20f0: 2c 20 31 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 1, DB_SchemaLo
2100: 61 64 65 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  aded);.    rc = 
2110: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
2120: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
2130: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2140: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2150: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f 72   a read-only (or
2160: 20 72 65 61 64 2d 77 72 69 74 65 29 20 74 72 61   read-write) tra
2170: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 0a  nsaction opened.
2180: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62 2d 74 72    ** on the b-tr
2190: 65 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70 65  ee database, ope
21a0: 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61 20  n one now. If a 
21b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
21c0: 70 65 6e 65 64 2c 20 69 74 20 0a 20 20 2a 2a 20  pened, it .  ** 
21d0: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 64 20 62  will be closed b
21e0: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
21f0: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 20 2a 2f  ion returns.  */
2200: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
2210: 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  nter(pDb->pBt);.
2220: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 74    if( !sqlite3Bt
2230: 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
2240: 28 70 44 62 2d 3e 70 42 74 29 20 29 7b 0a 20 20  (pDb->pBt) ){.  
2250: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2260: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 44  reeBeginTrans(pD
2270: 62 2d 3e 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  b->pBt, 0, 0);. 
2280: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2290: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22a0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70  lite3SetString(p
22b0: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 73 71 6c  zErrMsg, db, sql
22c0: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
22d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69 74  .      goto init
22e0: 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  one_error_out;. 
22f0: 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 65 64 54     }.    openedT
2300: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 31 3b 0a  ransaction = 1;.
2310: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68    }..  /* Get th
2320: 65 20 64 61 74 61 62 61 73 65 20 6d 65 74 61 20  e database meta 
2330: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
2340: 2a 0a 20 20 2a 2a 20 4d 65 74 61 20 76 61 6c 75  *.  ** Meta valu
2350: 65 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77  es are as follow
2360: 73 3a 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b  s:.  **    meta[
2370: 30 5d 20 20 20 53 63 68 65 6d 61 20 63 6f 6f 6b  0]   Schema cook
2380: 69 65 2e 20 20 43 68 61 6e 67 65 73 20 77 69 74  ie.  Changes wit
2390: 68 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  h each schema ch
23a0: 61 6e 67 65 2e 0a 20 20 2a 2a 20 20 20 20 6d 65  ange..  **    me
23b0: 74 61 5b 31 5d 20 20 20 46 69 6c 65 20 66 6f 72  ta[1]   File for
23c0: 6d 61 74 20 6f 66 20 73 63 68 65 6d 61 20 6c 61  mat of schema la
23d0: 79 65 72 2e 0a 20 20 2a 2a 20 20 20 20 6d 65 74  yer..  **    met
23e0: 61 5b 32 5d 20 20 20 53 69 7a 65 20 6f 66 20 74  a[2]   Size of t
23f0: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  he page cache.. 
2400: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 33 5d 20 20   **    meta[3]  
2410: 20 4c 61 72 67 65 73 74 20 72 6f 6f 74 70 61 67   Largest rootpag
2420: 65 20 28 61 75 74 6f 2f 69 6e 63 72 5f 76 61 63  e (auto/incr_vac
2430: 75 75 6d 20 6d 6f 64 65 29 0a 20 20 2a 2a 20 20  uum mode).  **  
2440: 20 20 6d 65 74 61 5b 34 5d 20 20 20 44 62 20 74    meta[4]   Db t
2450: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20 31 3a  ext encoding. 1:
2460: 55 54 46 2d 38 20 32 3a 55 54 46 2d 31 36 4c 45  UTF-8 2:UTF-16LE
2470: 20 33 3a 55 54 46 2d 31 36 42 45 0a 20 20 2a 2a   3:UTF-16BE.  **
2480: 20 20 20 20 6d 65 74 61 5b 35 5d 20 20 20 55 73      meta[5]   Us
2490: 65 72 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20  er version.  ** 
24a0: 20 20 20 6d 65 74 61 5b 36 5d 20 20 20 49 6e 63     meta[6]   Inc
24b0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
24c0: 6d 6f 64 65 0a 20 20 2a 2a 20 20 20 20 6d 65 74  mode.  **    met
24d0: 61 5b 37 5d 20 20 20 75 6e 75 73 65 64 0a 20 20  a[7]   unused.  
24e0: 2a 2a 20 20 20 20 6d 65 74 61 5b 38 5d 20 20 20  **    meta[8]   
24f0: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20 20 6d  unused.  **    m
2500: 65 74 61 5b 39 5d 20 20 20 75 6e 75 73 65 64 0a  eta[9]   unused.
2510: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
2520: 54 68 65 20 23 64 65 66 69 6e 65 64 20 53 51 4c  The #defined SQL
2530: 49 54 45 5f 55 54 46 2a 20 73 79 6d 62 6f 6c 73  ITE_UTF* symbols
2540: 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
2550: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a 20 20  correspond to.  
2560: 2a 2a 20 74 68 65 20 70 6f 73 73 69 62 6c 65 20  ** the possible 
2570: 76 61 6c 75 65 73 20 6f 66 20 6d 65 74 61 5b 34  values of meta[4
2580: 5d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ]..  */.  for(i=
2590: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 6d  0; i<ArraySize(m
25a0: 65 74 61 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eta); i++){.    
25b0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
25c0: 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 69 2b  eta(pDb->pBt, i+
25d0: 31 2c 20 28 75 33 32 20 2a 29 26 6d 65 74 61 5b  1, (u32 *)&meta[
25e0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  i]);.  }.  if( (
25f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2600: 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
2610: 29 21 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  )!=0 ){.    mems
2620: 65 74 28 6d 65 74 61 2c 20 30 2c 20 73 69 7a 65  et(meta, 0, size
2630: 6f 66 28 6d 65 74 61 29 29 3b 0a 20 20 7d 0a 20  of(meta));.  }. 
2640: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73   pDb->pSchema->s
2650: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 6d  chema_cookie = m
2660: 65 74 61 5b 42 54 52 45 45 5f 53 43 48 45 4d 41  eta[BTREE_SCHEMA
2670: 5f 56 45 52 53 49 4f 4e 2d 31 5d 3b 0a 0a 20 20  _VERSION-1];..  
2680: 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 61 20  /* If opening a 
2690: 6e 6f 6e 2d 65 6d 70 74 79 20 64 61 74 61 62 61  non-empty databa
26a0: 73 65 2c 20 63 68 65 63 6b 20 74 68 65 20 74 65  se, check the te
26b0: 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20 46 6f 72  xt encoding. For
26c0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20 64   the.  ** main d
26d0: 61 74 61 62 61 73 65 2c 20 73 65 74 20 73 71 6c  atabase, set sql
26e0: 69 74 65 33 2e 65 6e 63 20 74 6f 20 74 68 65 20  ite3.enc to the 
26f0: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
2700: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  main database.. 
2710: 20 2a 2a 20 46 6f 72 20 61 6e 20 61 74 74 61 63   ** For an attac
2720: 68 65 64 20 64 62 2c 20 69 74 20 69 73 20 61 6e  hed db, it is an
2730: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 65 6e   error if the en
2740: 63 6f 64 69 6e 67 20 69 73 20 6e 6f 74 20 74 68  coding is not th
2750: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 73  e same.  ** as s
2760: 71 6c 69 74 65 33 2e 65 6e 63 2e 0a 20 20 2a 2f  qlite3.enc..  */
2770: 0a 20 20 69 66 28 20 6d 65 74 61 5b 42 54 52 45  .  if( meta[BTRE
2780: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2d  E_TEXT_ENCODING-
2790: 31 5d 20 29 7b 20 20 2f 2a 20 74 65 78 74 20 65  1] ){  /* text e
27a0: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 69  ncoding */.    i
27b0: 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 23 69 66  f( iDb==0 ){.#if
27c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27d0: 5f 55 54 46 31 36 0a 20 20 20 20 20 20 75 38 20  _UTF16.      u8 
27e0: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20  encoding;.      
27f0: 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 74 68  /* If opening th
2800: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c  e main database,
2810: 20 73 65 74 20 45 4e 43 28 64 62 29 2e 20 2a 2f   set ENC(db). */
2820: 0a 20 20 20 20 20 20 65 6e 63 6f 64 69 6e 67 20  .      encoding 
2830: 3d 20 28 75 38 29 6d 65 74 61 5b 42 54 52 45 45  = (u8)meta[BTREE
2840: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2d 31  _TEXT_ENCODING-1
2850: 5d 20 26 20 33 3b 0a 20 20 20 20 20 20 69 66 28  ] & 3;.      if(
2860: 20 65 6e 63 6f 64 69 6e 67 3d 3d 30 20 29 20 65   encoding==0 ) e
2870: 6e 63 6f 64 69 6e 67 20 3d 20 53 51 4c 49 54 45  ncoding = SQLITE
2880: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 45 4e 43  _UTF8;.      ENC
2890: 28 64 62 29 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  (db) = encoding;
28a0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 45 4e 43  .#else.      ENC
28b0: 28 64 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  (db) = SQLITE_UT
28c0: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  F8;.#endif.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
28e0: 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 61 74 74  f opening an att
28f0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2c 20  ached database, 
2900: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6d 75 63  the encoding muc
2910: 68 20 6d 61 74 63 68 20 45 4e 43 28 64 62 29 20  h match ENC(db) 
2920: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 65 74  */.      if( met
2930: 61 5b 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43  a[BTREE_TEXT_ENC
2940: 4f 44 49 4e 47 2d 31 5d 21 3d 45 4e 43 28 64 62  ODING-1]!=ENC(db
2950: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
2960: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a  ite3SetString(pz
2970: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 61 74 74  ErrMsg, db, "att
2980: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
2990: 6d 75 73 74 20 75 73 65 20 74 68 65 20 73 61 6d  must use the sam
29a0: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e".            "
29b0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
29c0: 73 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 22  s main database"
29d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
29e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29f0: 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69 74 6f        goto inito
2a00: 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  ne_error_out;.  
2a10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2a20: 6c 73 65 7b 0a 20 20 20 20 44 62 53 65 74 50 72  lse{.    DbSetPr
2a30: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
2a40: 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20 7d 0a 20  DB_Empty);.  }. 
2a50: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 65   pDb->pSchema->e
2a60: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 0a 20  nc = ENC(db);.. 
2a70: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
2a80: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3d 3d 30  a->cache_size==0
2a90: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2aa0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
2ab0: 45 44 0a 20 20 20 20 73 69 7a 65 20 3d 20 73 71  ED.    size = sq
2ac0: 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 6d 65  lite3AbsInt32(me
2ad0: 74 61 5b 42 54 52 45 45 5f 44 45 46 41 55 4c 54  ta[BTREE_DEFAULT
2ae0: 5f 43 41 43 48 45 5f 53 49 5a 45 2d 31 5d 29 3b  _CACHE_SIZE-1]);
2af0: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3d 3d 30  .    if( size==0
2b00: 20 29 7b 20 73 69 7a 65 20 3d 20 53 51 4c 49 54   ){ size = SQLIT
2b10: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
2b20: 53 49 5a 45 3b 20 7d 0a 20 20 20 20 70 44 62 2d  SIZE; }.    pDb-
2b30: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
2b40: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 23 65 6c  size = size;.#el
2b50: 73 65 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  se.    pDb->pSch
2b60: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  ema->cache_size 
2b70: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2b80: 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 23 65 6e  _CACHE_SIZE;.#en
2b90: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 42  dif.    sqlite3B
2ba0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
2bb0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
2bc0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
2bd0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize);.  }..  /*.
2be0: 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74    ** file_format
2bf0: 3d 3d 31 20 20 20 20 56 65 72 73 69 6f 6e 20 33  ==1    Version 3
2c00: 2e 30 2e 30 2e 0a 20 20 2a 2a 20 66 69 6c 65 5f  .0.0..  ** file_
2c10: 66 6f 72 6d 61 74 3d 3d 32 20 20 20 20 56 65 72  format==2    Ver
2c20: 73 69 6f 6e 20 33 2e 31 2e 33 2e 20 20 2f 2f 20  sion 3.1.3.  // 
2c30: 41 4c 54 45 52 20 54 41 42 4c 45 20 41 44 44 20  ALTER TABLE ADD 
2c40: 43 4f 4c 55 4d 4e 0a 20 20 2a 2a 20 66 69 6c 65  COLUMN.  ** file
2c50: 5f 66 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56 65  _format==3    Ve
2c60: 72 73 69 6f 6e 20 33 2e 31 2e 34 2e 20 20 2f 2f  rsion 3.1.4.  //
2c70: 20 64 69 74 74 6f 20 62 75 74 20 77 69 74 68 20   ditto but with 
2c80: 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74  non-NULL default
2c90: 73 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d  s.  ** file_form
2ca0: 61 74 3d 3d 34 20 20 20 20 56 65 72 73 69 6f 6e  at==4    Version
2cb0: 20 33 2e 33 2e 30 2e 20 20 2f 2f 20 44 45 53 43   3.3.0.  // DESC
2cc0: 20 69 6e 64 69 63 65 73 2e 20 20 42 6f 6f 6c 65   indices.  Boole
2cd0: 61 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  an constants.  *
2ce0: 2f 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  /.  pDb->pSchema
2cf0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20  ->file_format = 
2d00: 28 75 38 29 6d 65 74 61 5b 42 54 52 45 45 5f 46  (u8)meta[BTREE_F
2d10: 49 4c 45 5f 46 4f 52 4d 41 54 2d 31 5d 3b 0a 20  ILE_FORMAT-1];. 
2d20: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
2d30: 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d  a->file_format==
2d40: 30 20 29 7b 0a 20 20 20 20 70 44 62 2d 3e 70 53  0 ){.    pDb->pS
2d50: 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
2d60: 61 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  at = 1;.  }.  if
2d70: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
2d80: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 53 51 4c 49  file_format>SQLI
2d90: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
2da0: 41 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  AT ){.    sqlite
2db0: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
2dc0: 4d 73 67 2c 20 64 62 2c 20 22 75 6e 73 75 70 70  Msg, db, "unsupp
2dd0: 6f 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d 61  orted file forma
2de0: 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t");.    rc = SQ
2df0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2e00: 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72 72  goto initone_err
2e10: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
2e20: 2a 20 54 69 63 6b 65 74 20 23 32 38 30 34 3a 20  * Ticket #2804: 
2e30: 20 57 68 65 6e 20 77 65 20 6f 70 65 6e 20 61 20   When we open a 
2e40: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
2e50: 6e 65 77 65 72 20 66 69 6c 65 20 66 6f 72 6d 61  newer file forma
2e60: 74 2c 0a 20 20 2a 2a 20 63 6c 65 61 72 20 74 68  t,.  ** clear th
2e70: 65 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f 66 6f  e legacy_file_fo
2e80: 72 6d 61 74 20 70 72 61 67 6d 61 20 66 6c 61 67  rmat pragma flag
2e90: 20 73 6f 20 74 68 61 74 20 61 20 56 41 43 55 55   so that a VACUU
2ea0: 4d 20 77 69 6c 6c 0a 20 20 2a 2a 20 6e 6f 74 20  M will.  ** not 
2eb0: 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 64 61  downgrade the da
2ec0: 74 61 62 61 73 65 20 61 6e 64 20 74 68 75 73 20  tabase and thus 
2ed0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 64  invalidate any d
2ee0: 65 73 63 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 69  escending.  ** i
2ef0: 6e 64 69 63 65 73 20 74 68 61 74 20 74 68 65 20  ndices that the 
2f00: 75 73 65 72 20 6d 69 67 68 74 20 68 61 76 65 20  user might have 
2f10: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
2f20: 69 66 28 20 69 44 62 3d 3d 30 20 26 26 20 6d 65  if( iDb==0 && me
2f30: 74 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  ta[BTREE_FILE_FO
2f40: 52 4d 41 54 2d 31 5d 3e 3d 34 20 29 7b 0a 20 20  RMAT-1]>=4 ){.  
2f50: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2f60: 28 75 36 34 29 53 51 4c 49 54 45 5f 4c 65 67 61  (u64)SQLITE_Lega
2f70: 63 79 46 69 6c 65 46 6d 74 3b 0a 20 20 7d 0a 0a  cyFileFmt;.  }..
2f80: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63    /* Read the sc
2f90: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
2fa0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 68 65   out of the sche
2fb0: 6d 61 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20  ma tables.  */. 
2fc0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
2fd0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 7b 0a 20 20  t.busy );.  {.  
2fe0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2ff0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
3000: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
3010: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
3020: 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
3030: 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 25 73 20   FROM \"%w\".%s 
3040: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
3050: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
3060: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
3070: 7a 4d 61 73 74 65 72 4e 61 6d 65 29 3b 0a 23 69  zMasterName);.#i
3080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3090: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
30a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
30b0: 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
30c0: 0a 20 20 20 20 20 20 78 41 75 74 68 20 3d 20 64  .      xAuth = d
30d0: 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 20 20  b->xAuth;.      
30e0: 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 23  db->xAuth = 0;.#
30f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
3100: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
3110: 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49  , zSql, sqlite3I
3120: 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e  nitCallback, &in
3130: 69 74 44 61 74 61 2c 20 30 29 3b 0a 23 69 66 6e  itData, 0);.#ifn
3140: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3150: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
3160: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
3170: 78 41 75 74 68 3b 0a 20 20 20 20 7d 0a 23 65 6e  xAuth;.    }.#en
3180: 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
3190: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
31a0: 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20   initData.rc;.  
31b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
31c0: 64 62 2c 20 7a 53 71 6c 29 3b 0a 23 69 66 6e 64  db, zSql);.#ifnd
31d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31e0: 4e 41 4c 59 5a 45 0a 20 20 20 20 69 66 28 20 72  NALYZE.    if( r
31f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 6e 61        sqlite3Ana
3210: 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 69 44  lysisLoad(db, iD
3220: 62 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  b);.    }.#endif
3230: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
3240: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
3250: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
3260: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
3270: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
3280: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
3290: 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  n(db);.  }.  if(
32a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
32b0: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  | (db->flags&SQL
32c0: 49 54 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f  ITE_NoSchemaErro
32d0: 72 29 29 7b 0a 20 20 20 20 2f 2a 20 42 6c 61 63  r)){.    /* Blac
32e0: 6b 20 6d 61 67 69 63 3a 20 49 66 20 74 68 65 20  k magic: If the 
32f0: 53 51 4c 49 54 45 5f 4e 6f 53 63 68 65 6d 61 45  SQLITE_NoSchemaE
3300: 72 72 6f 72 20 66 6c 61 67 20 69 73 20 73 65 74  rror flag is set
3310: 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 0a  , then consider.
3320: 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
3330: 61 20 6c 6f 61 64 65 64 2c 20 65 76 65 6e 20 69  a loaded, even i
3340: 66 20 65 72 72 6f 72 73 20 6f 63 63 75 72 72 65  f errors occurre
3350: 64 2e 20 49 6e 20 74 68 69 73 20 73 69 74 75 61  d. In this situa
3360: 74 69 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  tion the .    **
3370: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
3380: 5f 70 72 65 70 61 72 65 28 29 20 6f 70 65 72 61  _prepare() opera
3390: 74 69 6f 6e 20 77 69 6c 6c 20 66 61 69 6c 2c 20  tion will fail, 
33a0: 62 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  but the followin
33b0: 67 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 77 69 6c  g one.    ** wil
33c0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  l attempt to com
33d0: 70 69 6c 65 20 74 68 65 20 73 75 70 70 6c 69 65  pile the supplie
33e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  d statement agai
33f0: 6e 73 74 20 77 68 61 74 65 76 65 72 20 73 75 62  nst whatever sub
3400: 73 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  set.    ** of th
3410: 65 20 73 63 68 65 6d 61 20 77 61 73 20 6c 6f 61  e schema was loa
3420: 64 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ded before the e
3430: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 54  rror occurred. T
3440: 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a  he primary.    *
3450: 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  * purpose of thi
3460: 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77 20 61 63  s is to allow ac
3470: 63 65 73 73 20 74 6f 20 74 68 65 20 73 71 6c 69  cess to the sqli
3480: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  te_master table.
3490: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
34a0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 68 61   its contents ha
34b0: 76 65 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65  ve been corrupte
34c0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 44 62  d..    */.    Db
34d0: 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
34e0: 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  iDb, DB_SchemaLo
34f0: 61 64 65 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  aded);.    rc = 
3500: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
3510: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3520: 5f 4f 4b 20 26 26 20 69 44 62 21 3d 31 20 26 26  _OK && iDb!=1 &&
3530: 20 28 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   (db->openFlags 
3540: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
3550: 41 52 45 44 5f 53 43 48 45 4d 41 29 20 29 7b 0a  ARED_SCHEMA) ){.
3560: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3570: 53 63 68 65 6d 61 43 6f 6e 6e 65 63 74 28 64 62  SchemaConnect(db
3580: 2c 20 69 44 62 2c 20 69 6e 69 74 44 61 74 61 2e  , iDb, initData.
3590: 63 6b 73 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  cksum);.  }..  /
35a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
35b0: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  an error that oc
35c0: 63 75 72 73 20 61 66 74 65 72 20 73 75 63 63 65  curs after succe
35d0: 73 73 66 75 6c 6c 79 20 61 6c 6c 6f 63 61 74 69  ssfully allocati
35e0: 6e 67 0a 20 20 2a 2a 20 63 75 72 4d 61 69 6e 20  ng.  ** curMain 
35f0: 61 6e 64 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  and calling sqli
3600: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 2e  te3BtreeEnter().
3610: 20 46 6f 72 20 61 6e 20 65 72 72 6f 72 20 74 68   For an error th
3620: 61 74 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 62  at occurs.  ** b
3630: 65 66 6f 72 65 20 74 68 61 74 20 70 6f 69 6e 74  efore that point
3640: 2c 20 6a 75 6d 70 20 74 6f 20 65 72 72 6f 72 5f  , jump to error_
3650: 6f 75 74 2e 0a 20 20 2a 2f 0a 69 6e 69 74 6f 6e  out..  */.initon
3660: 65 5f 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69  e_error_out:.  i
3670: 66 28 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63  f( openedTransac
3680: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  tion ){.    sqli
3690: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
36a0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20  Db->pBt);.  }.  
36b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
36c0: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 0a 65 72  e(pDb->pBt);..er
36d0: 72 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  ror_out:.  if( r
36e0: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  c ){.    if( rc=
36f0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
3700: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
3710: 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
3720: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
3730: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (db);.    }.    
3740: 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53  sqlite3ResetOneS
3750: 63 68 65 6d 61 28 64 62 2c 20 69 44 62 29 3b 0a  chema(db, iDb);.
3760: 20 20 7d 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62    }.  db->init.b
3770: 75 73 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  usy = 0;.  retur
3780: 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
3790: 69 74 65 33 4c 6f 63 6b 52 65 75 73 61 62 6c 65  ite3LockReusable
37a0: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
37b0: 64 62 29 7b 0a 20 20 69 66 28 20 49 73 52 65 75  db){.  if( IsReu
37c0: 73 65 53 63 68 65 6d 61 28 64 62 29 20 26 26 20  seSchema(db) && 
37d0: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
37e0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 49 6e 75  DBFLAG_SchemaInu
37f0: 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  se)==0 ){.    db
3800: 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
3810: 46 4c 41 47 5f 53 63 68 65 6d 61 49 6e 75 73 65  FLAG_SchemaInuse
3820: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
3830: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3840: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  }.void sqlite3Un
3850: 6c 6f 63 6b 52 65 75 73 61 62 6c 65 53 63 68 65  lockReusableSche
3860: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
3870: 69 6e 74 20 62 52 65 6c 65 61 73 65 29 7b 0a 20  int bRelease){. 
3880: 20 69 66 28 20 62 52 65 6c 65 61 73 65 20 29 7b   if( bRelease ){
3890: 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  .    db->mDbFlag
38a0: 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68  s &= ~DBFLAG_Sch
38b0: 65 6d 61 49 6e 75 73 65 3b 0a 20 20 20 20 73 71  emaInuse;.    sq
38c0: 6c 69 74 65 33 53 63 68 65 6d 61 52 65 6c 65 61  lite3SchemaRelea
38d0: 73 65 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 7d  seAll(db);.  }.}
38e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
38f0: 7a 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ze all database 
3900: 66 69 6c 65 73 20 2d 20 74 68 65 20 6d 61 69 6e  files - the main
3910: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
3920: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 75 73 65 64  the file.** used
3930: 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72   to store tempor
3940: 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20  ary tables, and 
3950: 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 64  any additional d
3960: 61 74 61 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a  atabase files.**
3970: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 41   created using A
3980: 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
3990: 2e 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63  .  Return a succ
39a0: 65 73 73 20 63 6f 64 65 2e 20 20 49 66 20 61 6e  ess code.  If an
39b0: 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
39c0: 2c 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  , write an error
39d0: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 2a 70   message into *p
39e0: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 41  zErrMsg..**.** A
39f0: 66 74 65 72 20 61 20 64 61 74 61 62 61 73 65 20  fter a database 
3a00: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  is initialized, 
3a10: 74 68 65 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61  the DB_SchemaLoa
3a20: 64 65 64 20 62 69 74 20 69 73 20 73 65 74 0a 2a  ded bit is set.*
3a30: 2a 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  * bit is set in 
3a40: 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
3a50: 6f 66 20 74 68 65 20 44 62 20 73 74 72 75 63 74  of the Db struct
3a60: 75 72 65 2e 20 49 66 20 74 68 65 20 64 61 74 61  ure. If the data
3a70: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 61 73  base.** file was
3a80: 20 6f 66 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 2c   of zero-length,
3a90: 20 74 68 65 6e 20 74 68 65 20 44 42 5f 45 6d 70   then the DB_Emp
3aa0: 74 79 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  ty flag is also 
3ab0: 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
3ac0: 74 65 33 49 6e 69 74 28 73 71 6c 69 74 65 33 20  te3Init(sqlite3 
3ad0: 2a 64 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  *db, char **pzEr
3ae0: 72 4d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  rMsg){.  int rc 
3af0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
3b00: 6e 74 20 62 52 65 6c 65 61 73 65 53 63 68 65 6d  nt bReleaseSchem
3b10: 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  a;.  int i;.  in
3b20: 74 20 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61  t commit_interna
3b30: 6c 20 3d 20 21 28 64 62 2d 3e 6d 44 62 46 6c 61  l = !(db->mDbFla
3b40: 67 73 26 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  gs&DBFLAG_Schema
3b50: 43 68 61 6e 67 65 29 3b 0a 0a 20 20 62 52 65 6c  Change);..  bRel
3b60: 65 61 73 65 53 63 68 65 6d 61 20 3d 20 73 71 6c  easeSchema = sql
3b70: 69 74 65 33 4c 6f 63 6b 52 65 75 73 61 62 6c 65  ite3LockReusable
3b80: 53 63 68 65 6d 61 28 64 62 29 3b 0a 20 20 0a 20  Schema(db);.  . 
3b90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3ba0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
3bb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
3bc0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
3bd0: 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61  HoldsMutex(db->a
3be0: 44 62 5b 30 5d 2e 70 42 74 29 20 29 3b 0a 20 20  Db[0].pBt) );.  
3bf0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
3c00: 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 45 4e  .busy==0 );.  EN
3c10: 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45  C(db) = SCHEMA_E
3c20: 4e 43 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  NC(db);.  assert
3c30: 28 20 64 62 2d 3e 6e 44 62 3e 30 20 29 3b 0a 20  ( db->nDb>0 );. 
3c40: 20 2f 2a 20 44 6f 20 74 68 65 20 6d 61 69 6e 20   /* Do the main 
3c50: 73 63 68 65 6d 61 20 66 69 72 73 74 20 2a 2f 0a  schema first */.
3c60: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
3c70: 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53  erty(db, 0, DB_S
3c80: 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
3c90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3ca0: 49 6e 69 74 4f 6e 65 28 64 62 2c 20 30 2c 20 70  InitOne(db, 0, p
3cb0: 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 7d  zErrMsg, 0);.  }
3cc0: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
3cd0: 73 63 68 65 6d 61 73 20 61 66 74 65 72 20 74 68  schemas after th
3ce0: 65 20 6d 61 69 6e 20 73 63 68 65 6d 61 2e 20 54  e main schema. T
3cf0: 68 65 20 22 74 65 6d 70 22 20 73 63 68 65 6d 61  he "temp" schema
3d00: 20 6d 75 73 74 20 62 65 20 6c 61 73 74 20 2a 2f   must be last */
3d10: 0a 20 20 66 6f 72 28 69 3d 64 62 2d 3e 6e 44 62  .  for(i=db->nDb
3d20: 2d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  -1; rc==SQLITE_O
3d30: 4b 20 26 26 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  K && i>0; i--){.
3d40: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 31      assert( i==1
3d50: 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
3d60: 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61  HoldsMutex(db->a
3d70: 44 62 5b 69 5d 2e 70 42 74 29 20 29 3b 0a 20 20  Db[i].pBt) );.  
3d80: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
3d90: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53  erty(db, i, DB_S
3da0: 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
3db0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
3dc0: 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20 69 2c  e3InitOne(db, i,
3dd0: 20 70 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20   pzErrMsg, 0);. 
3de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
3df0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
3e00: 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20  commit_internal 
3e10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
3e20: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
3e30: 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ges(db);.  }.  s
3e40: 71 6c 69 74 65 33 55 6e 6c 6f 63 6b 52 65 75 73  qlite3UnlockReus
3e50: 61 62 6c 65 53 63 68 65 6d 61 28 64 62 2c 20 62  ableSchema(db, b
3e60: 52 65 6c 65 61 73 65 53 63 68 65 6d 61 29 3b 0a  ReleaseSchema);.
3e70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3e80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3e90: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ne is a no-op if
3ea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
3eb0: 68 65 6d 61 20 69 73 20 61 6c 72 65 61 64 79 20  hema is already 
3ec0: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20  initialized..** 
3ed0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
3ee0: 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 2e  chema is loaded.
3ef0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
3f00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
3f10: 6e 74 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  nt sqlite3ReadSc
3f20: 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
3f30: 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  se){.  int rc = 
3f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
3f50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
3f60: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
3f70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3f80: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
3f90: 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  ;.  if( !db->ini
3fa0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 64 62  t.busy ){.    db
3fb0: 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
3fc0: 46 4c 41 47 5f 46 72 65 65 53 63 68 65 6d 61 3b  FLAG_FreeSchema;
3fd0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 68 61        /* For sha
3fe0: 72 61 62 6c 65 2d 73 63 68 65 6d 61 20 6d 6f 64  rable-schema mod
3ff0: 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
4000: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 70  lite3Init(db, &p
4010: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
4020: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
4030: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4040: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
4050: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4060: 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  Err++;.    }else
4070: 20 69 66 28 20 64 62 2d 3e 6e 6f 53 68 61 72 65   if( db->noShare
4080: 64 43 61 63 68 65 20 26 26 20 21 49 73 52 65 75  dCache && !IsReu
4090: 73 65 53 63 68 65 6d 61 28 64 62 29 20 29 7b 0a  seSchema(db) ){.
40a0: 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61        db->mDbFla
40b0: 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
40c0: 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 20 20  emaKnownOk;.    
40d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
40e0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  c;.}.../*.** Che
40f0: 63 6b 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ck schema cookie
4100: 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
4110: 65 73 2e 20 20 49 66 20 61 6e 79 20 63 6f 6f 6b  es.  If any cook
4120: 69 65 20 69 73 20 6f 75 74 0a 2a 2a 20 6f 66 20  ie is out.** of 
4130: 64 61 74 65 20 73 65 74 20 70 50 61 72 73 65 2d  date set pParse-
4140: 3e 72 63 20 74 6f 20 53 51 4c 49 54 45 5f 53 43  >rc to SQLITE_SC
4150: 48 45 4d 41 2e 20 20 49 66 20 61 6c 6c 20 73 63  HEMA.  If all sc
4160: 68 65 6d 61 20 63 6f 6f 6b 69 65 73 0a 2a 2a 20  hema cookies.** 
4170: 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  make no changes 
4180: 74 6f 20 70 50 61 72 73 65 2d 3e 72 63 2e 0a 2a  to pParse->rc..*
4190: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 63  /.static void sc
41a0: 68 65 6d 61 49 73 56 61 6c 69 64 28 50 61 72 73  hemaIsValid(Pars
41b0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
41c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
41d0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
41e0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
41f0: 6e 74 20 63 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73  nt cookie;..  as
4200: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 68  sert( pParse->ch
4210: 65 63 6b 53 63 68 65 6d 61 20 29 3b 0a 20 20 61  eckSchema );.  a
4220: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4230: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
4240: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 44  tex) );.  for(iD
4250: 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  b=0; iDb<db->nDb
4260: 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 69 6e  ; iDb++){.    in
4270: 74 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74  t openedTransact
4280: 69 6f 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ion = 0;        
4290: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 72   /* True if a tr
42a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
42b0: 6e 65 64 20 2a 2f 0a 20 20 20 20 42 74 72 65 65  ned */.    Btree
42c0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
42d0: 69 44 62 5d 2e 70 42 74 3b 20 20 20 20 20 2f 2a  iDb].pBt;     /*
42e0: 20 42 74 72 65 65 20 64 61 74 61 62 61 73 65 20   Btree database 
42f0: 74 6f 20 72 65 61 64 20 63 6f 6f 6b 69 65 20 66  to read cookie f
4300: 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rom */.    if( p
4310: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
4320: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
4330: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
4340: 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f  y a read-only (o
4350: 72 20 72 65 61 64 2d 77 72 69 74 65 29 20 74 72  r read-write) tr
4360: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
4370: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62  .    ** on the b
4380: 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
4390: 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66  open one now. If
43a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
43b0: 73 20 6f 70 65 6e 65 64 2c 20 69 74 20 0a 20 20  s opened, it .  
43c0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c 6f    ** will be clo
43d0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  sed immediately 
43e0: 61 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  after reading th
43f0: 65 20 6d 65 74 61 2d 76 61 6c 75 65 2e 20 2a 2f  e meta-value. */
4400: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
4410: 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
4420: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
4430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
4440: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
4450: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
4460: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
4470: 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OMEM || rc==SQLI
4480: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
4490: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
44a0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
44b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
44c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
44d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 6f   return;.      o
44e0: 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e  penedTransaction
44f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
4500: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63 68   /* Read the sch
4510: 65 6d 61 20 63 6f 6f 6b 69 65 20 66 72 6f 6d 20  ema cookie from 
4520: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
4530: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   it does not mat
4540: 63 68 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 76  ch the .    ** v
4550: 61 6c 75 65 20 73 74 6f 72 65 64 20 61 73 20 70  alue stored as p
4560: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
4570: 6d 6f 72 79 20 73 63 68 65 6d 61 20 72 65 70 72  mory schema repr
4580: 65 73 65 6e 74 61 74 69 6f 6e 2c 0a 20 20 20 20  esentation,.    
4590: 2a 2a 20 73 65 74 20 50 61 72 73 65 2e 72 63 20  ** set Parse.rc 
45a0: 74 6f 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  to SQLITE_SCHEMA
45b0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
45c0: 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 42 74  BtreeGetMeta(pBt
45d0: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
45e0: 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26  ERSION, (u32 *)&
45f0: 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 61 73 73  cookie);.    ass
4600: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4610: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4620: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69  iDb, 0) );.    i
4630: 66 28 20 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e 61  f( cookie!=db->a
4640: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
4650: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  >schema_cookie )
4660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
4670: 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62  esetOneSchema(db
4680: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 70 50  , iDb);.      pP
4690: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
46a0: 45 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 7d 0a  E_SCHEMA;.    }.
46b0: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68  .    /* Close th
46c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  e transaction, i
46d0: 66 20 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65 64  f one was opened
46e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 65  . */.    if( ope
46f0: 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  nedTransaction )
4700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
4710: 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
4720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4730: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
4740: 68 65 6d 61 20 70 6f 69 6e 74 65 72 20 69 6e 74  hema pointer int
4750: 6f 20 74 68 65 20 69 44 62 20 69 6e 64 65 78 20  o the iDb index 
4760: 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a  that indicates.*
4770: 2a 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65  * which database
4780: 20 66 69 6c 65 20 69 6e 20 64 62 2d 3e 61 44 62   file in db->aDb
4790: 5b 5d 20 74 68 65 20 73 63 68 65 6d 61 20 72 65  [] the schema re
47a0: 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49  fers to..**.** I
47b0: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
47c0: 61 73 65 20 69 73 20 61 74 74 61 63 68 65 64 20  ase is attached 
47d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20  more than once, 
47e0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 74 74  the first.** att
47f0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69  ached database i
4800: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4810: 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  nt sqlite3Schema
4820: 54 6f 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ToIndex(sqlite3 
4830: 2a 64 62 2c 20 53 63 68 65 6d 61 20 2a 70 53 63  *db, Schema *pSc
4840: 68 65 6d 61 29 7b 0a 20 20 69 6e 74 20 69 20 3d  hema){.  int i =
4850: 20 2d 31 30 30 30 30 30 30 3b 0a 0a 20 20 2f 2a   -1000000;..  /*
4860: 20 49 66 20 70 53 63 68 65 6d 61 20 69 73 20 4e   If pSchema is N
4870: 55 4c 4c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ULL, then return
4880: 20 2d 31 30 30 30 30 30 30 2e 20 54 68 69 73 20   -1000000. This 
4890: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
48a0: 65 20 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e  e in .  ** expr.
48b0: 63 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 72  c is trying to r
48c0: 65 73 6f 6c 76 65 20 61 20 72 65 66 65 72 65 6e  esolve a referen
48d0: 63 65 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e  ce to a transien
48e0: 74 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e  t table (i.e. on
48f0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  e.  ** created b
4900: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2e  y a sub-select).
4910: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4920: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
4930: 66 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e  f this .  ** fun
4940: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76  ction should nev
4950: 65 72 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  er be used..  **
4960: 0a 20 20 2a 2a 20 57 65 20 72 65 74 75 72 6e 20  .  ** We return 
4970: 2d 31 30 30 30 30 30 30 20 69 6e 73 74 65 61 64  -1000000 instead
4980: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 75 73 75   of the more usu
4990: 61 6c 20 2d 31 20 73 69 6d 70 6c 79 20 62 65 63  al -1 simply bec
49a0: 61 75 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20  ause using.  ** 
49b0: 2d 31 30 30 30 30 30 30 20 61 73 20 74 68 65 20  -1000000 as the 
49c0: 69 6e 63 6f 72 72 65 63 74 20 69 6e 64 65 78 20  incorrect index 
49d0: 69 6e 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69  into db->aDb[] i
49e0: 73 20 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72  s much .  ** mor
49f0: 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75 73  e likely to caus
4a00: 65 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 61  e a segfault tha
4a10: 6e 20 2d 31 20 28 6f 66 20 63 6f 75 72 73 65 20  n -1 (of course 
4a20: 74 68 65 72 65 20 61 72 65 20 61 73 73 65 72 74  there are assert
4a30: 28 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  ().  ** statemen
4a40: 74 73 20 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e  ts too, but it n
4a50: 65 76 65 72 20 68 75 72 74 73 20 74 6f 20 70 6c  ever hurts to pl
4a60: 61 79 20 74 68 65 20 6f 64 64 73 29 2e 0a 20 20  ay the odds)..  
4a70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
4a80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4a90: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
4aa0: 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20  if( pSchema ){. 
4ab0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 31 3b 20 69     for(i=0; 1; i
4ac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
4ad0: 74 28 20 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  t( i<db->nDb );.
4ae0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
4af0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 53  b[i].pSchema==pS
4b00: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
4b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4b20: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4b30: 28 20 69 3e 3d 30 20 26 26 20 69 3c 64 62 2d 3e  ( i>=0 && i<db->
4b40: 6e 44 62 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  nDb );.  }.  ret
4b50: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
4b60: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
4b70: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 74  allocations in t
4b80: 68 65 20 70 50 61 72 73 65 20 6f 62 6a 65 63 74  he pParse object
4b90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4ba0: 50 61 72 73 65 72 52 65 73 65 74 28 50 61 72 73  ParserReset(Pars
4bb0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
4bc0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4bd0: 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  se->db;.  sqlite
4be0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72  3DbFree(db, pPar
4bf0: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73  se->aLabel);.  s
4c00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4c10: 6c 65 74 65 28 64 62 2c 20 70 50 61 72 73 65 2d  lete(db, pParse-
4c20: 3e 70 43 6f 6e 73 74 45 78 70 72 29 3b 0a 20 20  >pConstExpr);.  
4c30: 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
4c40: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
4c50: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3e 3d 20  ide.bDisable >= 
4c60: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c  pParse->disableL
4c70: 6f 6f 6b 61 73 69 64 65 20 29 3b 0a 20 20 20 20  ookaside );.    
4c80: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
4c90: 69 73 61 62 6c 65 20 2d 3d 20 70 50 61 72 73 65  isable -= pParse
4ca0: 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69  ->disableLookasi
4cb0: 64 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  de;.  }.  pParse
4cc0: 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69  ->disableLookasi
4cd0: 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  de = 0;.}../*.**
4ce0: 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46   Compile the UTF
4cf0: 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  -8 encoded SQL s
4d00: 74 61 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e  tatement zSql in
4d10: 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68  to a statement h
4d20: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
4d30: 20 69 6e 74 20 73 71 6c 69 74 65 33 50 72 65 70   int sqlite3Prep
4d40: 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
4d50: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4d60: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
4d70: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
4d80: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
4d90: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
4da0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
4db0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
4dc0: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
4dd0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
4de0: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
4df0: 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67  /.  u32 prepFlag
4e00: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
4e10: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
4e20: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
4e30: 6c 61 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  lags */.  Vdbe *
4e40: 70 52 65 70 72 65 70 61 72 65 2c 20 20 20 20 20  pReprepare,     
4e50: 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
4e60: 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20  reprepared */.  
4e70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
4e80: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
4e90: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
4ea0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
4eb0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
4ec0: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
4ed0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
4ee0: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
4ef0: 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  g */.){.  char *
4f00: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
4f10: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
4f20: 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  sage */.  int rc
4f30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
4f40: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
4f50: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4f80: 72 20 2a 2f 0a 20 20 50 61 72 73 65 20 73 50 61  r */.  Parse sPa
4f90: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
4fa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4fb0: 65 78 74 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74  ext */..  memset
4fc0: 28 26 73 50 61 72 73 65 2c 20 30 2c 20 50 41 52  (&sParse, 0, PAR
4fd0: 53 45 5f 48 44 52 5f 53 5a 29 3b 0a 20 20 6d 65  SE_HDR_SZ);.  me
4fe0: 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28  mset(PARSE_TAIL(
4ff0: 26 73 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  &sParse), 0, PAR
5000: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
5010: 50 61 72 73 65 2e 70 52 65 70 72 65 70 61 72 65  Parse.pReprepare
5020: 20 3d 20 70 52 65 70 72 65 70 61 72 65 3b 0a 20   = pReprepare;. 
5030: 20 61 73 73 65 72 74 28 20 70 70 53 74 6d 74 20   assert( ppStmt 
5040: 26 26 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b  && *ppStmt==0 );
5050: 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 64  .  /* assert( !d
5060: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5070: 29 3b 20 2f 2f 20 6e 6f 74 20 74 72 75 65 20 77  ); // not true w
5080: 69 74 68 20 53 51 4c 49 54 45 5f 55 53 45 5f 41  ith SQLITE_USE_A
5090: 4c 4c 4f 43 41 20 2a 2f 0a 20 20 61 73 73 65 72  LLOCA */.  asser
50a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
50b0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
50c0: 20 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20   );..  /* For a 
50d0: 6c 6f 6e 67 2d 74 65 72 6d 20 75 73 65 20 70 72  long-term use pr
50e0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
50f0: 20 61 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f   avoid the use o
5100: 66 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  f.  ** lookaside
5110: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20   memory..  */.  
5120: 69 66 28 20 70 72 65 70 46 6c 61 67 73 20 26 20  if( prepFlags & 
5130: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50  SQLITE_PREPARE_P
5140: 45 52 53 49 53 54 45 4e 54 20 29 7b 0a 20 20 20  ERSISTENT ){.   
5150: 20 73 50 61 72 73 65 2e 64 69 73 61 62 6c 65 4c   sParse.disableL
5160: 6f 6f 6b 61 73 69 64 65 2b 2b 3b 0a 20 20 20 20  ookaside++;.    
5170: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
5180: 69 73 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20  isable++;.  }.  
5190: 73 50 61 72 73 65 2e 64 69 73 61 62 6c 65 56 74  sParse.disableVt
51a0: 61 62 20 3d 20 28 70 72 65 70 46 6c 61 67 73 20  ab = (prepFlags 
51b0: 26 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45  & SQLITE_PREPARE
51c0: 5f 4e 4f 5f 56 54 41 42 29 21 3d 30 3b 0a 0a 20  _NO_VTAB)!=0;.. 
51d0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 76 65 72   /* Check to ver
51e0: 69 66 79 20 74 68 61 74 20 69 74 20 69 73 20 70  ify that it is p
51f0: 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 61  ossible to get a
5200: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 61 6c   read lock on al
5210: 6c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  l.  ** database 
5220: 73 63 68 65 6d 61 73 2e 20 20 54 68 65 20 69 6e  schemas.  The in
5230: 61 62 69 6c 69 74 79 20 74 6f 20 67 65 74 20 61  ability to get a
5240: 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 64 69 63   read lock indic
5250: 61 74 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 73  ates that.  ** s
5260: 6f 6d 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  ome other databa
5270: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
5280: 20 68 6f 6c 64 69 6e 67 20 61 20 77 72 69 74 65   holding a write
5290: 2d 6c 6f 63 6b 2c 20 77 68 69 63 68 20 69 6e 0a  -lock, which in.
52a0: 20 20 2a 2a 20 74 75 72 6e 20 6d 65 61 6e 73 20    ** turn means 
52b0: 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 63  that the other c
52c0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6d 61  onnection has ma
52d0: 64 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63  de uncommitted c
52e0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74  hanges.  ** to t
52f0: 68 65 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2a 0a  he schema..  **.
5300: 20 20 2a 2a 20 57 65 72 65 20 77 65 20 74 6f 20    ** Were we to 
5310: 70 72 6f 63 65 65 64 20 61 6e 64 20 70 72 65 70  proceed and prep
5320: 61 72 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  are the statemen
5330: 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 75 6e  t against the un
5340: 63 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 73  committed.  ** s
5350: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 6e  chema changes an
5360: 64 20 69 66 20 74 68 6f 73 65 20 73 63 68 65 6d  d if those schem
5370: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 73 75  a changes are su
5380: 62 73 65 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65  bsequently rolle
5390: 64 0a 20 20 2a 2a 20 62 61 63 6b 20 61 6e 64 20  d.  ** back and 
53a0: 64 69 66 66 65 72 65 6e 74 20 63 68 61 6e 67 65  different change
53b0: 73 20 61 72 65 20 6d 61 64 65 20 69 6e 20 74 68  s are made in th
53c0: 65 69 72 20 70 6c 61 63 65 2c 20 74 68 65 6e 20  eir place, then 
53d0: 77 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70  when this.  ** p
53e0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
53f0: 74 20 67 6f 65 73 20 74 6f 20 72 75 6e 20 74 68  t goes to run th
5400: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
5410: 77 6f 75 6c 64 20 66 61 69 6c 20 74 6f 20 64 65  would fail to de
5420: 74 65 63 74 0a 20 20 2a 2a 20 74 68 65 20 73 63  tect.  ** the sc
5430: 68 65 6d 61 20 63 68 61 6e 67 65 2e 20 20 44 69  hema change.  Di
5440: 73 61 73 74 65 72 20 77 6f 75 6c 64 20 66 6f 6c  saster would fol
5450: 6c 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  low..  **.  ** T
5460: 68 69 73 20 74 68 72 65 61 64 20 69 73 20 63 75  his thread is cu
5470: 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
5480: 6d 75 74 65 78 65 73 20 6f 6e 20 61 6c 6c 20 42  mutexes on all B
5490: 74 72 65 65 73 20 28 62 65 63 61 75 73 65 0a 20  trees (because. 
54a0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74   ** of the sqlit
54b0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
54c0: 29 20 69 6e 20 73 71 6c 69 74 65 33 4c 6f 63 6b  ) in sqlite3Lock
54d0: 41 6e 64 50 72 65 70 61 72 65 28 29 29 20 73 6f  AndPrepare()) so
54e0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   it.  ** is not 
54f0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 6f  possible for ano
5500: 74 68 65 72 20 74 68 72 65 61 64 20 74 6f 20 73  ther thread to s
5510: 74 61 72 74 20 61 20 6e 65 77 20 73 63 68 65 6d  tart a new schem
5520: 61 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 68  a change.  ** wh
5530: 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ile this routine
5540: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 48 65   is running.  He
5550: 6e 63 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 6e  nce, we do not n
5560: 65 65 64 20 74 6f 20 68 6f 6c 64 20 0a 20 20 2a  eed to hold .  *
5570: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 73  * locks on the s
5580: 63 68 65 6d 61 2c 20 77 65 20 6a 75 73 74 20 6e  chema, we just n
5590: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
55a0: 20 6e 6f 62 6f 64 79 20 65 6c 73 65 20 69 73 20   nobody else is 
55b0: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 68  .  ** holding th
55c0: 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  em..  **.  ** No
55d0: 74 65 20 74 68 61 74 20 73 65 74 74 69 6e 67 20  te that setting 
55e0: 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
55f0: 20 6f 76 65 72 72 69 64 65 73 20 6d 6f 73 74 20   overrides most 
5600: 6c 6f 63 6b 20 64 65 74 65 63 74 69 6f 6e 2c 0a  lock detection,.
5610: 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
5620: 20 2a 6e 6f 74 2a 20 6f 76 65 72 72 69 64 65 20   *not* override 
5630: 73 63 68 65 6d 61 20 6c 6f 63 6b 20 64 65 74 65  schema lock dete
5640: 63 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 61  ction, so this a
5650: 6c 6c 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 77 6f  ll still.  ** wo
5660: 72 6b 73 20 65 76 65 6e 20 69 66 20 52 45 41 44  rks even if READ
5670: 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 69 73 20  _UNCOMMITTED is 
5680: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
5690: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
56a0: 69 2b 2b 29 20 7b 0a 20 20 20 20 42 74 72 65 65  i++) {.    Btree
56b0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
56c0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
56d0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  pBt ){.      ass
56e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
56f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 29  eHoldsMutex(pBt)
5700: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
5710: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
5720: 61 4c 6f 63 6b 65 64 28 70 42 74 29 3b 0a 20 20  aLocked(pBt);.  
5730: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
5740: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
5750: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
5760: 69 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  i].zDbSName;.   
5770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5780: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
5790: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
57a0: 61 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22  a is locked: %s"
57b0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
57c0: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 66 6c  testcase( db->fl
57d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
57e0: 64 55 6e 63 6f 6d 6d 69 74 20 29 3b 0a 20 20 20  dUncommit );.   
57f0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72       goto end_pr
5800: 65 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  epare;.      }. 
5810: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
5820: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
5830: 74 28 64 62 29 3b 0a 0a 20 20 73 50 61 72 73 65  t(db);..  sParse
5840: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20  .db = db;.  if( 
5850: 6e 42 79 74 65 73 3e 3d 30 20 26 26 20 28 6e 42  nBytes>=0 && (nB
5860: 79 74 65 73 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  ytes==0 || zSql[
5870: 6e 42 79 74 65 73 2d 31 5d 21 3d 30 29 20 29 7b  nBytes-1]!=0) ){
5880: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 43  .    char *zSqlC
5890: 6f 70 79 3b 0a 20 20 20 20 69 6e 74 20 6d 78 4c  opy;.    int mxL
58a0: 65 6e 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  en = db->aLimit[
58b0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
58c0: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 74 65  _LENGTH];.    te
58d0: 73 74 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d  stcase( nBytes==
58e0: 6d 78 4c 65 6e 20 29 3b 0a 20 20 20 20 74 65 73  mxLen );.    tes
58f0: 74 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d  tcase( nBytes==m
5900: 78 4c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66  xLen+1 );.    if
5910: 28 20 6e 42 79 74 65 73 3e 6d 78 4c 65 6e 20 29  ( nBytes>mxLen )
5920: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5930: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
5940: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 2c 20 22  SQLITE_TOOBIG, "
5950: 73 74 61 74 65 6d 65 6e 74 20 74 6f 6f 20 6c 6f  statement too lo
5960: 6e 67 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ng");.      rc =
5970: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
5980: 64 62 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  db, SQLITE_TOOBI
5990: 47 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  G);.      goto e
59a0: 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20  nd_prepare;.    
59b0: 7d 0a 20 20 20 20 7a 53 71 6c 43 6f 70 79 20 3d  }.    zSqlCopy =
59c0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
59d0: 70 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74  p(db, zSql, nByt
59e0: 65 73 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  es);.    if( zSq
59f0: 6c 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73  lCopy ){.      s
5a00: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
5a10: 26 73 50 61 72 73 65 2c 20 7a 53 71 6c 43 6f 70  &sParse, zSqlCop
5a20: 79 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  y, &zErrMsg);.  
5a30: 20 20 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c      sParse.zTail
5a40: 20 3d 20 26 7a 53 71 6c 5b 73 50 61 72 73 65 2e   = &zSql[sParse.
5a50: 7a 54 61 69 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b  zTail-zSqlCopy];
5a60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5a70: 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 43 6f 70  Free(db, zSqlCop
5a80: 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
5a90: 20 20 20 20 20 73 50 61 72 73 65 2e 7a 54 61 69       sParse.zTai
5aa0: 6c 20 3d 20 26 7a 53 71 6c 5b 6e 42 79 74 65 73  l = &zSql[nBytes
5ab0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
5ac0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 75 6e  {.    sqlite3Run
5ad0: 50 61 72 73 65 72 28 26 73 50 61 72 73 65 2c 20  Parser(&sParse, 
5ae0: 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b  zSql, &zErrMsg);
5af0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
5b00: 3d 3d 73 50 61 72 73 65 2e 6e 51 75 65 72 79 4c  ==sParse.nQueryL
5b10: 6f 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 73 50  oop );..  if( sP
5b20: 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  arse.rc==SQLITE_
5b30: 44 4f 4e 45 20 29 20 73 50 61 72 73 65 2e 72 63  DONE ) sParse.rc
5b40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
5b50: 69 66 28 20 73 50 61 72 73 65 2e 63 68 65 63 6b  if( sParse.check
5b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 63  Schema ){.    sc
5b70: 68 65 6d 61 49 73 56 61 6c 69 64 28 26 73 50 61  hemaIsValid(&sPa
5b80: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rse);.  }.  if( 
5b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5ba0: 20 29 7b 0a 20 20 20 20 73 50 61 72 73 65 2e 72   ){.    sParse.r
5bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5bc0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
5bd0: 20 70 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 2a   pzTail ){.    *
5be0: 70 7a 54 61 69 6c 20 3d 20 73 50 61 72 73 65 2e  pzTail = sParse.
5bf0: 7a 54 61 69 6c 3b 0a 20 20 7d 0a 20 20 72 63 20  zTail;.  }.  rc 
5c00: 3d 20 73 50 61 72 73 65 2e 72 63 3b 0a 0a 23 69  = sParse.rc;..#i
5c10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c20: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
5c30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5c40: 20 73 50 61 72 73 65 2e 70 56 64 62 65 20 26 26   sParse.pVdbe &&
5c50: 20 73 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 20   sParse.explain 
5c60: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
5c70: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
5c80: 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b   azColName[] = {
5c90: 0a 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20  .       "addr", 
5ca0: 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
5cb0: 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22  "p2", "p3", "p4"
5cc0: 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74  , "p5", "comment
5cd0: 22 2c 0a 20 20 20 20 20 20 20 22 69 64 22 2c 20  ",.       "id", 
5ce0: 22 70 61 72 65 6e 74 22 2c 20 22 6e 6f 74 75 73  "parent", "notus
5cf0: 65 64 22 2c 20 22 64 65 74 61 69 6c 22 0a 20 20  ed", "detail".  
5d00: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 46 69    };.    int iFi
5d10: 72 73 74 2c 20 6d 78 3b 0a 20 20 20 20 69 66 28  rst, mx;.    if(
5d20: 20 73 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 3d   sParse.explain=
5d30: 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
5d40: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
5d50: 73 28 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20  s(sParse.pVdbe, 
5d60: 34 29 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74  4);.      iFirst
5d70: 20 3d 20 38 3b 0a 20 20 20 20 20 20 6d 78 20 3d   = 8;.      mx =
5d80: 20 31 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   12;.    }else{.
5d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5da0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 73 50 61 72  eSetNumCols(sPar
5db0: 73 65 2e 70 56 64 62 65 2c 20 38 29 3b 0a 20 20  se.pVdbe, 8);.  
5dc0: 20 20 20 20 69 46 69 72 73 74 20 3d 20 30 3b 0a      iFirst = 0;.
5dd0: 20 20 20 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20        mx = 8;.  
5de0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 46    }.    for(i=iF
5df0: 69 72 73 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29  irst; i<mx; i++)
5e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5e10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 73 50  dbeSetColName(sP
5e20: 61 72 73 65 2e 70 56 64 62 65 2c 20 69 2d 69 46  arse.pVdbe, i-iF
5e30: 69 72 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  irst, COLNAME_NA
5e40: 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ME,.            
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51  azColName[i], SQ
5e70: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
5e80: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
5e90: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
5ea0: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
5eb0: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
5ec0: 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20 7a 53  sParse.pVdbe, zS
5ed0: 71 6c 2c 20 28 69 6e 74 29 28 73 50 61 72 73 65  ql, (int)(sParse
5ee0: 2e 7a 54 61 69 6c 2d 7a 53 71 6c 29 2c 20 70 72  .zTail-zSql), pr
5ef0: 65 70 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  epFlags);.  }.  
5f00: 69 66 28 20 73 50 61 72 73 65 2e 70 56 64 62 65  if( sParse.pVdbe
5f10: 20 26 26 20 28 72 63 21 3d 53 51 4c 49 54 45 5f   && (rc!=SQLITE_
5f20: 4f 4b 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  OK || db->malloc
5f30: 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 73  Failed) ){.    s
5f40: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
5f50: 7a 65 28 73 50 61 72 73 65 2e 70 56 64 62 65 29  ze(sParse.pVdbe)
5f60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21 28 2a  ;.    assert(!(*
5f70: 70 70 53 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73  ppStmt));.  }els
5f80: 65 7b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  e{.    *ppStmt =
5f90: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29   (sqlite3_stmt*)
5fa0: 73 50 61 72 73 65 2e 70 56 64 62 65 3b 0a 20 20  sParse.pVdbe;.  
5fb0: 7d 0a 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  }..  if( zErrMsg
5fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5fd0: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
5fe0: 72 63 2c 20 22 25 73 22 2c 20 7a 45 72 72 4d 73  rc, "%s", zErrMs
5ff0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
6000: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
6010: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
6020: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
6030: 2c 20 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  , rc);.  }..  /*
6040: 20 44 65 6c 65 74 65 20 61 6e 79 20 54 72 69 67   Delete any Trig
6050: 67 65 72 50 72 67 20 73 74 72 75 63 74 75 72 65  gerPrg structure
6060: 73 20 61 6c 6c 6f 63 61 74 65 64 20 77 68 69 6c  s allocated whil
6070: 65 20 70 61 72 73 69 6e 67 20 74 68 69 73 20 73  e parsing this s
6080: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 77  tatement. */.  w
6090: 68 69 6c 65 28 20 73 50 61 72 73 65 2e 70 54 72  hile( sParse.pTr
60a0: 69 67 67 65 72 50 72 67 20 29 7b 0a 20 20 20 20  iggerPrg ){.    
60b0: 54 72 69 67 67 65 72 50 72 67 20 2a 70 54 20 3d  TriggerPrg *pT =
60c0: 20 73 50 61 72 73 65 2e 70 54 72 69 67 67 65 72   sParse.pTrigger
60d0: 50 72 67 3b 0a 20 20 20 20 73 50 61 72 73 65 2e  Prg;.    sParse.
60e0: 70 54 72 69 67 67 65 72 50 72 67 20 3d 20 70 54  pTriggerPrg = pT
60f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
6100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6110: 54 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 72 65  T);.  }..end_pre
6120: 70 61 72 65 3a 0a 0a 20 20 73 71 6c 69 74 65 33  pare:..  sqlite3
6130: 50 61 72 73 65 72 52 65 73 65 74 28 26 73 50 61  ParserReset(&sPa
6140: 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rse);.  return r
6150: 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
6160: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
6170: 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
6180: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
6190: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
61a0: 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73  andle. */.  cons
61b0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
61c0: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65        /* UTF-8 e
61d0: 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65  ncoded SQL state
61e0: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ment. */.  int n
61f0: 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20  Bytes,          
6200: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
6210: 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e  f zSql in bytes.
6220: 20 2a 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c   */.  u32 prepFl
6230: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
6240: 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  /* Zero or more 
6250: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a  SQLITE_PREPARE_*
6260: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 56 64 62 65   flags */.  Vdbe
6270: 20 2a 70 4f 6c 64 2c 20 20 20 20 20 20 20 20 20   *pOld,         
6280: 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
6290: 67 20 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a  g reprepared */.
62a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
62b0: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
62c0: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
62d0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
62e0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
62f0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c  st char **pzTail
6300: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
6310: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
6320: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
6330: 72 63 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  rc;.  int cnt = 
6340: 30 3b 0a 20 20 69 6e 74 20 62 52 65 6c 65 61 73  0;.  int bReleas
6350: 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 0a 23 69  eSchema = 0;..#i
6360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6370: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6380: 66 28 20 70 70 53 74 6d 74 3d 3d 30 20 29 20 72  f( ppStmt==0 ) r
6390: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
63a0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
63b0: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
63c0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
63d0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 7c  fetyCheckOk(db)|
63e0: 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  |zSql==0 ){.    
63f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6400: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
6410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6420: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
6430: 0a 20 20 62 52 65 6c 65 61 73 65 53 63 68 65 6d  .  bReleaseSchem
6440: 61 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 52  a = sqlite3LockR
6450: 65 75 73 61 62 6c 65 53 63 68 65 6d 61 28 64 62  eusableSchema(db
6460: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
6470: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
6480: 20 64 6f 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   do{.    /* Make
6490: 20 6d 75 6c 74 69 70 6c 65 20 61 74 74 65 6d 70   multiple attemp
64a0: 74 73 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68  ts to compile th
64b0: 65 20 53 51 4c 2c 20 75 6e 74 69 6c 20 69 74 20  e SQL, until it 
64c0: 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73 0a  either succeeds.
64d0: 20 20 20 20 2a 2a 20 6f 72 20 65 6e 63 6f 75 6e      ** or encoun
64e0: 74 65 72 73 20 61 20 70 65 72 6d 61 6e 65 6e 74  ters a permanent
64f0: 20 65 72 72 6f 72 2e 20 20 41 20 73 63 68 65 6d   error.  A schem
6500: 61 20 70 72 6f 62 6c 65 6d 20 61 66 74 65 72 20  a problem after 
6510: 6f 6e 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a  one schema.    *
6520: 2a 20 72 65 73 65 74 20 69 73 20 63 6f 6e 73 69  * reset is consi
6530: 64 65 72 65 64 20 61 20 70 65 72 6d 61 6e 65 6e  dered a permanen
6540: 74 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  t error. */.    
6550: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70  rc = sqlite3Prep
6560: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42  are(db, zSql, nB
6570: 79 74 65 73 2c 20 70 72 65 70 46 6c 61 67 73 2c  ytes, prepFlags,
6580: 20 70 4f 6c 64 2c 20 70 70 53 74 6d 74 2c 20 70   pOld, ppStmt, p
6590: 7a 54 61 69 6c 29 3b 0a 20 20 20 20 61 73 73 65  zTail);.    asse
65a0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
65b0: 4b 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  K || *ppStmt==0 
65c0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
65d0: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45  =SQLITE_ERROR_RE
65e0: 54 52 59 0a 20 20 20 20 20 20 20 7c 7c 20 28 72  TRY.       || (r
65f0: 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  c==SQLITE_SCHEMA
6600: 20 26 26 20 28 73 71 6c 69 74 65 33 52 65 73 65   && (sqlite3Rese
6610: 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 2d 31  tOneSchema(db,-1
6620: 29 2c 20 63 6e 74 2b 2b 29 3d 3d 30 29 20 29 3b  ), cnt++)==0) );
6630: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
6640: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
6650: 20 73 71 6c 69 74 65 33 55 6e 6c 6f 63 6b 52 65   sqlite3UnlockRe
6660: 75 73 61 62 6c 65 53 63 68 65 6d 61 28 64 62 2c  usableSchema(db,
6670: 20 62 52 65 6c 65 61 73 65 53 63 68 65 6d 61 29   bReleaseSchema)
6680: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
6690: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
66a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 72 63 26  ;.  assert( (rc&
66b0: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
66c0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
66d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
66e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
66f0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 72  c;.}.../*.** Rer
6700: 75 6e 20 74 68 65 20 63 6f 6d 70 69 6c 61 74 69  un the compilati
6710: 6f 6e 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  on of a statemen
6720: 74 20 61 66 74 65 72 20 61 20 73 63 68 65 6d 61  t after a schema
6730: 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   change..**.** I
6740: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
6750: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
6760: 72 65 63 6f 6d 70 69 6c 65 64 2c 20 72 65 74 75  recompiled, retu
6770: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
6780: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74  herwise,.** if t
6790: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
67a0: 6e 6f 74 20 62 65 20 72 65 63 6f 6d 70 69 6c 65  not be recompile
67b0: 64 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  d because anothe
67c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
67d0: 0a 2a 2a 20 6c 6f 63 6b 65 64 20 74 68 65 20 73  .** locked the s
67e0: 71 6c 69 74 65 33 5f 6d 61 73 74 65 72 20 74 61  qlite3_master ta
67f0: 62 6c 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ble, return SQLI
6800: 54 45 5f 4c 4f 43 4b 45 44 2e 20 49 66 20 61 6e  TE_LOCKED. If an
6810: 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
6820: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
6830: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a  SQLITE_SCHEMA..*
6840: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 70  /.int sqlite3Rep
6850: 72 65 70 61 72 65 28 56 64 62 65 20 2a 70 29 7b  repare(Vdbe *p){
6860: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6870: 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 77 3b  ite3_stmt *pNew;
6880: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6890: 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Sql;.  sqlite3 *
68a0: 64 62 3b 0a 20 20 75 38 20 70 72 65 70 46 6c 61  db;.  u8 prepFla
68b0: 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  gs;..  assert( s
68c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
68d0: 64 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  d(sqlite3VdbeDb(
68e0: 70 29 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  p)->mutex) );.  
68f0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
6900: 71 6c 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  ql((sqlite3_stmt
6910: 20 2a 29 70 29 3b 0a 20 20 61 73 73 65 72 74 28   *)p);.  assert(
6920: 20 7a 53 71 6c 21 3d 30 20 29 3b 20 20 2f 2a 20   zSql!=0 );  /* 
6930: 52 65 70 72 65 70 61 72 65 20 6f 6e 6c 79 20 63  Reprepare only c
6940: 61 6c 6c 65 64 20 66 6f 72 20 70 72 65 70 61 72  alled for prepar
6950: 65 5f 76 32 28 29 20 73 74 61 74 65 6d 65 6e 74  e_v2() statement
6960: 73 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  s */.  db = sqli
6970: 74 65 33 56 64 62 65 44 62 28 70 29 3b 0a 20 20  te3VdbeDb(p);.  
6980: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6990: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
69a0: 75 74 65 78 29 20 29 3b 0a 20 20 70 72 65 70 46  utex) );.  prepF
69b0: 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 56 64  lags = sqlite3Vd
69c0: 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 70  bePrepareFlags(p
69d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
69e0: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28  3LockAndPrepare(
69f0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 72  db, zSql, -1, pr
6a00: 65 70 46 6c 61 67 73 2c 20 70 2c 20 26 70 4e 65  epFlags, p, &pNe
6a10: 77 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  w, 0);.  if( rc 
6a20: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
6a30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
6a40: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
6a50: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
6a60: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
6a70: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
6a80: 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  n rc;.  }else{. 
6a90: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
6aa0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =0 );.  }.  sqli
6ab0: 74 65 33 56 64 62 65 53 77 61 70 28 28 56 64 62  te3VdbeSwap((Vdb
6ac0: 65 2a 29 70 4e 65 77 2c 20 70 29 3b 0a 20 20 73  e*)pNew, p);.  s
6ad0: 71 6c 69 74 65 33 54 72 61 6e 73 66 65 72 42 69  qlite3TransferBi
6ae0: 6e 64 69 6e 67 73 28 70 4e 65 77 2c 20 28 73 71  ndings(pNew, (sq
6af0: 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 3b 0a  lite3_stmt*)p);.
6b00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
6b10: 65 74 53 74 65 70 52 65 73 75 6c 74 28 28 56 64  etStepResult((Vd
6b20: 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20 73 71 6c  be*)pNew);.  sql
6b30: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
6b40: 28 28 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20  ((Vdbe*)pNew);. 
6b50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6b60: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  K;.}.../*.** Two
6b70: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
6b80: 20 6f 66 66 69 63 69 61 6c 20 41 50 49 2e 20 20   official API.  
6b90: 4c 65 67 61 63 79 20 61 6e 64 20 6e 65 77 20 75  Legacy and new u
6ba0: 73 65 2e 20 20 49 6e 20 74 68 65 20 6c 65 67 61  se.  In the lega
6bb0: 63 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 74  cy.** version, t
6bc0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
6bd0: 74 65 78 74 20 69 73 20 6e 6f 74 20 73 61 76 65  text is not save
6be0: 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
6bf0: 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61  d statement.** a
6c00: 6e 64 20 73 6f 20 69 66 20 61 20 73 63 68 65 6d  nd so if a schem
6c10: 61 20 63 68 61 6e 67 65 20 6f 63 63 75 72 73 2c  a change occurs,
6c20: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69   SQLITE_SCHEMA i
6c30: 73 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a  s returned by.**
6c40: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
6c50: 20 20 49 6e 20 74 68 65 20 6e 65 77 20 76 65 72    In the new ver
6c60: 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e  sion, the origin
6c70: 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 72  al SQL text is r
6c80: 65 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  etained.** and t
6c90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
6ca0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65  automatically re
6cb0: 63 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e 20 73  compiled if an s
6cc0: 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a 2a 20  chema change.** 
6cd0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
6ce0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 0a  qlite3_prepare(.
6cf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6d10: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
6d20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6d30: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f  *zSql,         /
6d40: 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  * UTF-8 encoded 
6d50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  SQL statement. *
6d60: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20  /.  int nBytes, 
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6d80: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20   Length of zSql 
6d90: 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73  in bytes. */.  s
6da0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
6db0: 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt,    /* OUT:
6dc0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
6dd0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6de0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
6df0: 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20  char **pzTail   
6e00: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20      /* OUT: End 
6e10: 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67  of parsed string
6e20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6e30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c  .  rc = sqlite3L
6e40: 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62  ockAndPrepare(db
6e50: 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 30 2c 30  ,zSql,nBytes,0,0
6e60: 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b  ,ppStmt,pzTail);
6e70: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
6e80: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74  QLITE_OK || ppSt
6e90: 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74  mt==0 || *ppStmt
6ea0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49 46  ==0 );  /* VERIF
6eb0: 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20 72  Y: F13021 */.  r
6ec0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
6ed0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
6ee0: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
6ef0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
6f00: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
6f10: 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  le. */.  const c
6f20: 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
6f30: 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f     /* UTF-8 enco
6f40: 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ded SQL statemen
6f50: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  t. */.  int nByt
6f60: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  es,             
6f70: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
6f80: 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f  Sql in bytes. */
6f90: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6fa0: 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20  **ppStmt,    /* 
6fb0: 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74  OUT: A pointer t
6fc0: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
6fd0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
6fe0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69  nst char **pzTai
6ff0: 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  l       /* OUT: 
7000: 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74  End of parsed st
7010: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
7020: 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e   rc;.  /* EVIDEN
7030: 43 45 2d 4f 46 3a 20 52 2d 33 37 39 32 33 2d 31  CE-OF: R-37923-1
7040: 32 31 37 33 20 54 68 65 20 73 71 6c 69 74 65 33  2173 The sqlite3
7050: 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 69 6e  _prepare_v2() in
7060: 74 65 72 66 61 63 65 20 77 6f 72 6b 73 0a 20 20  terface works.  
7070: 2a 2a 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  ** exactly the s
7080: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 70  ame as sqlite3_p
7090: 72 65 70 61 72 65 5f 76 33 28 29 20 77 69 74 68  repare_v3() with
70a0: 20 61 20 7a 65 72 6f 20 70 72 65 70 46 6c 61 67   a zero prepFlag
70b0: 73 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  s.  ** parameter
70c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 6f 6f  ..  **.  ** Proo
70d0: 66 20 69 6e 20 74 68 61 74 20 74 68 65 20 35 74  f in that the 5t
70e0: 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 73  h parameter to s
70f0: 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65  qlite3LockAndPre
7100: 70 61 72 65 20 69 73 20 30 20 2a 2f 0a 20 20 72  pare is 0 */.  r
7110: 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41  c = sqlite3LockA
7120: 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53 71  ndPrepare(db,zSq
7130: 6c 2c 6e 42 79 74 65 73 2c 53 51 4c 49 54 45 5f  l,nBytes,SQLITE_
7140: 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c 2c  PREPARE_SAVESQL,
7150: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a  ppStmt,pzTail);.
7180: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
7190: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d  LITE_OK || ppStm
71a0: 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d  t==0 || *ppStmt=
71b0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
71c0: 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
71d0: 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20 20 73  _prepare_v3(.  s
71e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
71f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7200: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a  base handle. */.
7210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7220: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ql,         /* U
7230: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c  TF-8 encoded SQL
7240: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
7250: 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20   int nBytes,    
7260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7270: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20  ngth of zSql in 
7280: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 6e 73 69  bytes. */.  unsi
7290: 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46 6c 61  gned int prepFla
72a0: 67 73 2c 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72  gs,   /* Zero or
72b0: 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50 52 45   more SQLITE_PRE
72c0: 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  PARE_* flags */.
72d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
72e0: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
72f0: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
7300: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
7310: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
7320: 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c  st char **pzTail
7330: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
7340: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
7350: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
7360: 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  rc;.  /* EVIDENC
7370: 45 2d 4f 46 3a 20 52 2d 35 36 38 36 31 2d 34 32  E-OF: R-56861-42
7380: 36 37 33 20 73 71 6c 69 74 65 33 5f 70 72 65 70  673 sqlite3_prep
7390: 61 72 65 5f 76 33 28 29 20 64 69 66 66 65 72 73  are_v3() differs
73a0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
73b0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
73c0: 6f 6e 6c 79 20 69 6e 20 68 61 76 69 6e 67 20 74  only in having t
73d0: 68 65 20 65 78 74 72 61 20 70 72 65 70 46 6c 61  he extra prepFla
73e0: 67 73 20 70 61 72 61 6d 65 74 65 72 2c 0a 20 20  gs parameter,.  
73f0: 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20 62 69  ** which is a bi
7400: 74 20 61 72 72 61 79 20 63 6f 6e 73 69 73 74 69  t array consisti
7410: 6e 67 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ng of zero or mo
7420: 72 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 53  re of the.  ** S
7430: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20  QLITE_PREPARE_* 
7440: 66 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  flags..  **.  **
7450: 20 50 72 6f 6f 66 20 62 79 20 63 6f 6d 70 61 72   Proof by compar
7460: 69 73 6f 6e 20 74 6f 20 74 68 65 20 69 6d 70 6c  ison to the impl
7470: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
7480: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
7490: 28 29 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  ().  ** directly
74a0: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 72 63 20   above. */.  rc 
74b0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64  = sqlite3LockAnd
74c0: 50 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c  Prepare(db,zSql,
74d0: 6e 42 79 74 65 73 2c 0a 20 20 20 20 20 20 20 20  nBytes,.        
74e0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
74f0: 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c 7c  PREPARE_SAVESQL|
7500: 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49 54  (prepFlags&SQLIT
7510: 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c  E_PREPARE_MASK),
7520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7530: 20 20 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69    0,ppStmt,pzTai
7540: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
7550: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
7560: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
7570: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  tmt==0 );.  retu
7580: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  rn rc;.}...#ifnd
7590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
75a0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  TF16./*.** Compi
75b0: 6c 65 20 74 68 65 20 55 54 46 2d 31 36 20 65 6e  le the UTF-16 en
75c0: 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d  coded SQL statem
75d0: 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f 20 61 20  ent zSql into a 
75e0: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
75f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7600: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36  sqlite3Prepare16
7610: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7630: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
7640: 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f  . */ .  const vo
7650: 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  id *zSql,       
7660: 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f    /* UTF-16 enco
7670: 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ded SQL statemen
7680: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  t. */.  int nByt
7690: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  es,             
76a0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
76b0: 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f  Sql in bytes. */
76c0: 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67 73  .  u32 prepFlags
76d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
76e0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c  Zero or more SQL
76f0: 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c  ITE_PREPARE_* fl
7700: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
7710: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
7720: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
7730: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
7740: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
7750: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
7760: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
7770: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
7780: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
7790: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
77a0: 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 77 6f  ion currently wo
77b0: 72 6b 73 20 62 79 20 66 69 72 73 74 20 74 72 61  rks by first tra
77c0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 55 54  nsforming the UT
77d0: 46 2d 31 36 0a 20 20 2a 2a 20 65 6e 63 6f 64 65  F-16.  ** encode
77e0: 64 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  d string to UTF-
77f0: 38 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 69 6e 67  8, then invoking
7800: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
7810: 28 29 2e 20 54 68 65 0a 20 20 2a 2a 20 74 72 69  (). The.  ** tri
7820: 63 6b 79 20 62 69 74 20 69 73 20 66 69 67 75 72  cky bit is figur
7830: 69 6e 67 20 6f 75 74 20 74 68 65 20 70 6f 69 6e  ing out the poin
7840: 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 69 6e  ter to return in
7850: 20 2a 70 7a 54 61 69 6c 2e 0a 20 20 2a 2f 0a 20   *pzTail..  */. 
7860: 20 63 68 61 72 20 2a 7a 53 71 6c 38 3b 0a 20 20   char *zSql8;.  
7870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
7880: 6c 38 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  l8 = 0;.  int rc
7890: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
78a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
78b0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
78c0: 69 66 28 20 70 70 53 74 6d 74 3d 3d 30 20 29 20  if( ppStmt==0 ) 
78d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
78e0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
78f0: 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  f.  *ppStmt = 0;
7900: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7910: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
7920: 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ||zSql==0 ){.   
7930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
7940: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
7950: 20 20 69 66 28 20 6e 42 79 74 65 73 3e 3d 30 20    if( nBytes>=0 
7960: 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  ){.    int sz;. 
7970: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7980: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7990: 7a 53 71 6c 3b 0a 20 20 20 20 66 6f 72 28 73 7a  zSql;.    for(sz
79a0: 3d 30 3b 20 73 7a 3c 6e 42 79 74 65 73 20 26 26  =0; sz<nBytes &&
79b0: 20 28 7a 5b 73 7a 5d 21 3d 30 20 7c 7c 20 7a 5b   (z[sz]!=0 || z[
79c0: 73 7a 2b 31 5d 21 3d 30 29 3b 20 73 7a 20 2b 3d  sz+1]!=0); sz +=
79d0: 20 32 29 7b 7d 0a 20 20 20 20 6e 42 79 74 65 73   2){}.    nBytes
79e0: 20 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 73 71 6c   = sz;.  }.  sql
79f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7a00: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7a  (db->mutex);.  z
7a10: 53 71 6c 38 20 3d 20 73 71 6c 69 74 65 33 55 74  Sql8 = sqlite3Ut
7a20: 66 31 36 74 6f 38 28 64 62 2c 20 7a 53 71 6c 2c  f16to8(db, zSql,
7a30: 20 6e 42 79 74 65 73 2c 20 53 51 4c 49 54 45 5f   nBytes, SQLITE_
7a40: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
7a50: 69 66 28 20 7a 53 71 6c 38 20 29 7b 0a 20 20 20  if( zSql8 ){.   
7a60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63   rc = sqlite3Loc
7a70: 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 20  kAndPrepare(db, 
7a80: 7a 53 71 6c 38 2c 20 2d 31 2c 20 70 72 65 70 46  zSql8, -1, prepF
7a90: 6c 61 67 73 2c 20 30 2c 20 70 70 53 74 6d 74 2c  lags, 0, ppStmt,
7aa0: 20 26 7a 54 61 69 6c 38 29 3b 0a 20 20 7d 0a 0a   &zTail8);.  }..
7ab0: 20 20 69 66 28 20 7a 54 61 69 6c 38 20 26 26 20    if( zTail8 && 
7ac0: 70 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 2f 2a  pzTail ){.    /*
7ad0: 20 49 66 20 73 71 6c 69 74 65 33 5f 70 72 65 70   If sqlite3_prep
7ae0: 61 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 61  are returns a ta
7af0: 69 6c 20 70 6f 69 6e 74 65 72 2c 20 77 65 20 63  il pointer, we c
7b00: 61 6c 63 75 6c 61 74 65 20 74 68 65 0a 20 20 20  alculate the.   
7b10: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 70   ** equivalent p
7b20: 6f 69 6e 74 65 72 20 69 6e 74 6f 20 74 68 65 20  ointer into the 
7b30: 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 62 79  UTF-16 string by
7b40: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 20 75 6e   counting the un
7b50: 69 63 6f 64 65 0a 20 20 20 20 2a 2a 20 63 68 61  icode.    ** cha
7b60: 72 61 63 74 65 72 73 20 62 65 74 77 65 65 6e 20  racters between 
7b70: 7a 53 71 6c 38 20 61 6e 64 20 7a 54 61 69 6c 38  zSql8 and zTail8
7b80: 2c 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  , and then retur
7b90: 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 0a 20  ning a pointer. 
7ba0: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e     ** the same n
7bb0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
7bc0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 55 54 46  ers into the UTF
7bd0: 2d 31 36 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  -16 string..    
7be0: 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68 61 72 73  */.    int chars
7bf0: 5f 70 61 72 73 65 64 20 3d 20 73 71 6c 69 74 65  _parsed = sqlite
7c00: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 53 71  3Utf8CharLen(zSq
7c10: 6c 38 2c 20 28 69 6e 74 29 28 7a 54 61 69 6c 38  l8, (int)(zTail8
7c20: 2d 7a 53 71 6c 38 29 29 3b 0a 20 20 20 20 2a 70  -zSql8));.    *p
7c30: 7a 54 61 69 6c 20 3d 20 28 75 38 20 2a 29 7a 53  zTail = (u8 *)zS
7c40: 71 6c 20 2b 20 73 71 6c 69 74 65 33 55 74 66 31  ql + sqlite3Utf1
7c50: 36 42 79 74 65 4c 65 6e 28 7a 53 71 6c 2c 20 63  6ByteLen(zSql, c
7c60: 68 61 72 73 5f 70 61 72 73 65 64 29 3b 0a 20 20  hars_parsed);.  
7c70: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
7c80: 65 28 64 62 2c 20 7a 53 71 6c 38 29 3b 20 0a 20  e(db, zSql8); . 
7c90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
7ca0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
7cb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7cc0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7cd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ce0: 2f 2a 0a 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f  /*.** Two versio
7cf0: 6e 73 20 6f 66 20 74 68 65 20 6f 66 66 69 63 69  ns of the offici
7d00: 61 6c 20 41 50 49 2e 20 20 4c 65 67 61 63 79 20  al API.  Legacy 
7d10: 61 6e 64 20 6e 65 77 20 75 73 65 2e 20 20 49 6e  and new use.  In
7d20: 20 74 68 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76   the legacy.** v
7d30: 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67  ersion, the orig
7d40: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73  inal SQL text is
7d50: 20 6e 6f 74 20 73 61 76 65 64 20 69 6e 20 74 68   not saved in th
7d60: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
7d70: 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69  ment.** and so i
7d80: 66 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67  f a schema chang
7d90: 65 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  e occurs, SQLITE
7da0: 5f 53 43 48 45 4d 41 20 69 73 20 72 65 74 75 72  _SCHEMA is retur
7db0: 6e 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ned by.** sqlite
7dc0: 33 5f 73 74 65 70 28 29 2e 20 20 49 6e 20 74 68  3_step().  In th
7dd0: 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 2c 20 74  e new version, t
7de0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
7df0: 74 65 78 74 20 69 73 20 72 65 74 61 69 6e 65 64  text is retained
7e00: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74  .** and the stat
7e10: 65 6d 65 6e 74 20 69 73 20 61 75 74 6f 6d 61 74  ement is automat
7e20: 69 63 61 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65  ically recompile
7e30: 64 20 69 66 20 61 6e 20 73 63 68 65 6d 61 20 63  d if an schema c
7e40: 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e  hange.** occurs.
7e50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7e60: 70 72 65 70 61 72 65 31 36 28 0a 20 20 73 71 6c  prepare16(.  sql
7e70: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
7e80: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7e90: 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20  se handle. */ . 
7ea0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
7eb0: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54  l,         /* UT
7ec0: 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c  F-16 encoded SQL
7ed0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
7ee0: 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20   int nBytes,    
7ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7f00: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20  ngth of zSql in 
7f10: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  bytes. */.  sqli
7f20: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
7f30: 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20  t,    /* OUT: A 
7f40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7f50: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
7f60: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  t */.  const voi
7f70: 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20  d **pzTail      
7f80: 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20   /* OUT: End of 
7f90: 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f  parsed string */
7fa0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7fb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70  rc = sqlite3Prep
7fc0: 61 72 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42  are16(db,zSql,nB
7fd0: 79 74 65 73 2c 30 2c 70 70 53 74 6d 74 2c 70 7a  ytes,0,ppStmt,pz
7fe0: 54 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Tail);.  assert(
7ff0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
8000: 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a  | ppStmt==0 || *
8010: 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a  ppStmt==0 );  /*
8020: 20 56 45 52 49 46 59 3a 20 46 31 33 30 32 31 20   VERIFY: F13021 
8030: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
8040: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72  }.int sqlite3_pr
8050: 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20 73 71  epare16_v2(.  sq
8060: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
8070: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
8080: 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a  ase handle. */ .
8090: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
80a0: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ql,         /* U
80b0: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51  TF-16 encoded SQ
80c0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  L statement. */.
80d0: 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20    int nBytes,   
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
80f0: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
8100: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c   bytes. */.  sql
8110: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
8120: 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41  mt,    /* OUT: A
8130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8140: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8150: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  nt */.  const vo
8160: 69 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20  id **pzTail     
8170: 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66    /* OUT: End of
8180: 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a   parsed string *
8190: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
81a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65   rc = sqlite3Pre
81b0: 70 61 72 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e  pare16(db,zSql,n
81c0: 42 79 74 65 73 2c 53 51 4c 49 54 45 5f 50 52 45  Bytes,SQLITE_PRE
81d0: 50 41 52 45 5f 53 41 56 45 53 51 4c 2c 70 70 53  PARE_SAVESQL,ppS
81e0: 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61  tmt,pzTail);.  a
81f0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
8200: 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d  E_OK || ppStmt==
8210: 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  0 || *ppStmt==0 
8220: 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46  );  /* VERIFY: F
8230: 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72  13021 */.  retur
8240: 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
8250: 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 33  te3_prepare16_v3
8260: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8280: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
8290: 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f  . */ .  const vo
82a0: 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  id *zSql,       
82b0: 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f    /* UTF-16 enco
82c0: 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ded SQL statemen
82d0: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  t. */.  int nByt
82e0: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  es,             
82f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
8300: 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f  Sql in bytes. */
8310: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
8320: 70 72 65 70 46 6c 61 67 73 2c 20 20 20 2f 2a 20  prepFlags,   /* 
8330: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c  Zero or more SQL
8340: 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c  ITE_PREPARE_* fl
8350: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
8360: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
8370: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
8380: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
8390: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
83a0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
83b0: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
83c0: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
83d0: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
83e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
83f0: 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  = sqlite3Prepare
8400: 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  16(db,zSql,nByte
8410: 73 2c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49  s,.         SQLI
8420: 54 45 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53  TE_PREPARE_SAVES
8430: 51 4c 7c 28 70 72 65 70 46 6c 61 67 73 26 53 51  QL|(prepFlags&SQ
8440: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4d 41 53  LITE_PREPARE_MAS
8450: 4b 29 2c 0a 20 20 20 20 20 20 20 20 20 70 70 53  K),.         ppS
8460: 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61  tmt,pzTail);.  a
8470: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
8480: 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d  E_OK || ppStmt==
8490: 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  0 || *ppStmt==0 
84a0: 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46  );  /* VERIFY: F
84b0: 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72  13021 */.  retur
84c0: 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
84d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
84e0: 54 46 31 36 20 2a 2f 0a                          TF16 */.