/ Hex Artifact Content
Login

Artifact b64a19ee9b0ba1f3a67c4f5d1be308e9f67f8fb07fe90725982dfa9b616d211f:


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 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
0510: 7a 3b 0a 20 20 20 20 69 66 28 20 7a 4f 62 6a 3d  z;.    if( zObj=
0520: 3d 30 20 29 20 7a 4f 62 6a 20 3d 20 22 3f 22 3b  =0 ) zObj = "?";
0530: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
0540: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6d 61 6c  MPrintf(db, "mal
0550: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
0560: 73 63 68 65 6d 61 20 28 25 73 29 22 2c 20 7a 4f  schema (%s)", zO
0570: 62 6a 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  bj);.    if( zEx
0580: 74 72 61 20 26 26 20 7a 45 78 74 72 61 5b 30 5d  tra && zExtra[0]
0590: 20 29 20 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50   ) z = sqlite3MP
05a0: 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 2d 20  rintf(db, "%z - 
05b0: 25 73 22 2c 20 7a 2c 20 7a 45 78 74 72 61 29 3b  %s", z, zExtra);
05c0: 0a 20 20 20 20 2a 70 44 61 74 61 2d 3e 70 7a 45  .    *pData->pzE
05d0: 72 72 4d 73 67 20 3d 20 7a 3b 0a 20 20 20 20 70  rrMsg = z;.    p
05e0: 44 61 74 61 2d 3e 72 63 20 3d 20 53 51 4c 49 54  Data->rc = SQLIT
05f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
0600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
0610: 61 74 65 20 74 68 65 20 53 63 68 65 6d 61 2e 63  ate the Schema.c
0620: 6b 73 75 6d 20 63 68 65 63 6b 73 75 6d 20 74 6f  ksum checksum to
0630: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
0640: 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74   database object
0650: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
0660: 20 74 68 65 20 74 68 72 65 65 20 61 72 67 75 6d   the three argum
0670: 65 6e 74 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ents following t
0680: 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 76 6f 69  he first..*/.voi
0690: 64 20 73 63 68 65 6d 61 55 70 64 61 74 65 43 68  d schemaUpdateCh
06a0: 65 63 6b 73 75 6d 28 0a 20 20 53 63 68 65 6d 61  ecksum(.  Schema
06b0: 20 2a 70 53 63 68 65 6d 61 2c 20 20 20 20 20 20   *pSchema,      
06c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68            /* Sch
06d0: 65 6d 61 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  ema object being
06e0: 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 6f 6e   parsed */.  con
06f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0710: 4e 61 6d 65 20 6f 66 20 6e 65 77 20 64 61 74 61  Name of new data
0720: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
0730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f   const char *zRo
0740: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
0750: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
0760: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 6f 62   new database ob
0770: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
0780: 63 68 61 72 20 2a 7a 53 71 6c 20 20 20 20 20 20  char *zSql      
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
07a0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
07b0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 6f 62 6a  new database obj
07c0: 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
07d0: 69 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d  i;.  u64 cksum =
07e0: 20 70 53 63 68 65 6d 61 2d 3e 63 6b 73 75 6d 3b   pSchema->cksum;
07f0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
0800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61      for(i=0; zNa
0810: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 20 63 6b 73 75  me[i]; i++) cksu
0820: 6d 20 2b 3d 20 28 63 6b 73 75 6d 3c 3c 33 29 20  m += (cksum<<3) 
0830: 2b 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 7d 0a  + zName[i];.  }.
0840: 20 20 69 66 28 20 7a 52 6f 6f 74 20 29 20 66 6f    if( zRoot ) fo
0850: 72 28 69 3d 30 3b 20 7a 52 6f 6f 74 5b 69 5d 3b  r(i=0; zRoot[i];
0860: 20 69 2b 2b 29 20 63 6b 73 75 6d 20 2b 3d 20 28   i++) cksum += (
0870: 63 6b 73 75 6d 3c 3c 33 29 20 2b 20 7a 52 6f 6f  cksum<<3) + zRoo
0880: 74 5b 69 5d 3b 0a 20 20 69 66 28 20 7a 53 71 6c  t[i];.  if( zSql
0890: 20 29 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c   ) for(i=0; zSql
08a0: 5b 69 5d 3b 20 69 2b 2b 29 20 63 6b 73 75 6d 20  [i]; i++) cksum 
08b0: 2b 3d 20 28 63 6b 73 75 6d 3c 3c 33 29 20 2b 20  += (cksum<<3) + 
08c0: 7a 53 71 6c 5b 69 5d 3b 0a 20 20 70 53 63 68 65  zSql[i];.  pSche
08d0: 6d 61 2d 3e 63 6b 73 75 6d 20 3d 20 63 6b 73 75  ma->cksum = cksu
08e0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  m;.}../*.** This
08f0: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
0900: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
0910: 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
0920: 61 6c 69 7a 65 73 20 74 68 65 0a 2a 2a 20 64 61  alizes the.** da
0930: 74 61 62 61 73 65 2e 20 20 53 65 65 20 73 71 6c  tabase.  See sql
0940: 69 74 65 33 49 6e 69 74 28 29 20 62 65 6c 6f 77  ite3Init() below
0950: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
0960: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
0970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0980: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 66 72 6f 6d  also called from
0990: 20 74 68 65 20 4f 50 5f 50 61 72 73 65 53 63 68   the OP_ParseSch
09a0: 65 6d 61 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ema opcode of th
09b0: 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a 2a 20 45 61  e VDBE..**.** Ea
09c0: 63 68 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74  ch callback cont
09d0: 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ains the followi
09e0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a  ng information:.
09f0: 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30  **.**     argv[0
0a00: 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 69 6e  ] = name of thin
0a10: 67 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 0a  g being created.
0a20: 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d  **     argv[1] =
0a30: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
0a40: 72 20 66 6f 72 20 74 61 62 6c 65 20 6f 72 20 69  r for table or i
0a50: 6e 64 65 78 2e 20 30 20 66 6f 72 20 74 72 69 67  ndex. 0 for trig
0a60: 67 65 72 20 6f 72 20 76 69 65 77 2e 0a 2a 2a 20  ger or view..** 
0a70: 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 53 51      argv[2] = SQ
0a80: 4c 20 74 65 78 74 20 66 6f 72 20 74 68 65 20 43  L text for the C
0a90: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  REATE statement.
0aa0: 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
0ab0: 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 76  e3InitCallback(v
0ac0: 6f 69 64 20 2a 70 49 6e 69 74 2c 20 69 6e 74 20  oid *pInit, int 
0ad0: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
0ae0: 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65  v, char **NotUse
0af0: 64 29 7b 0a 20 20 49 6e 69 74 44 61 74 61 20 2a  d){.  InitData *
0b00: 70 44 61 74 61 20 3d 20 28 49 6e 69 74 44 61 74  pData = (InitDat
0b10: 61 2a 29 70 49 6e 69 74 3b 0a 20 20 73 71 6c 69  a*)pInit;.  sqli
0b20: 74 65 33 20 2a 64 62 20 3d 20 70 44 61 74 61 2d  te3 *db = pData-
0b30: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  >db;.  int iDb =
0b40: 20 70 44 61 74 61 2d 3e 69 44 62 3b 0a 0a 20 20   pData->iDb;..  
0b50: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20  assert( argc==3 
0b60: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
0b70: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
0b80: 61 72 67 63 29 3b 0a 20 20 61 73 73 65 72 74 28  argc);.  assert(
0b90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
0ba0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
0bb0: 3b 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  ;.  DbClearPrope
0bc0: 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f  rty(db, iDb, DB_
0bd0: 45 6d 70 74 79 29 3b 0a 20 20 69 66 28 20 64 62  Empty);.  if( db
0be0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0bf0: 7b 0a 20 20 20 20 63 6f 72 72 75 70 74 53 63 68  {.    corruptSch
0c00: 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b  ema(pData, argv[
0c10: 30 5d 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  0], 0);.    retu
0c20: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  rn 1;.  }..  ass
0c30: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
0c40: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
0c50: 69 66 28 20 61 72 67 76 3d 3d 30 20 29 20 72 65  if( argv==0 ) re
0c60: 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 69 67  turn 0;   /* Mig
0c70: 68 74 20 68 61 70 70 65 6e 20 69 66 20 45 4d 50  ht happen if EMP
0c80: 54 59 5f 52 45 53 55 4c 54 5f 43 41 4c 4c 42 41  TY_RESULT_CALLBA
0c90: 43 4b 53 20 61 72 65 20 6f 6e 20 2a 2f 0a 20 20  CKS are on */.  
0ca0: 69 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29  if( argv[1]==0 )
0cb0: 7b 0a 20 20 20 20 63 6f 72 72 75 70 74 53 63 68  {.    corruptSch
0cc0: 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b  ema(pData, argv[
0cd0: 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  0], 0);.  }else 
0ce0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
0cf0: 69 63 6d 70 28 61 72 67 76 5b 32 5d 2c 22 63 72  icmp(argv[2],"cr
0d00: 65 61 74 65 20 22 2c 37 29 3d 3d 30 20 29 7b 0a  eate ",7)==0 ){.
0d10: 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20      /* Call the 
0d20: 70 61 72 73 65 72 20 74 6f 20 70 72 6f 63 65 73  parser to proces
0d30: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
0d40: 2c 20 49 4e 44 45 58 20 6f 72 20 56 49 45 57 2e  , INDEX or VIEW.
0d50: 0a 20 20 20 20 2a 2a 20 42 75 74 20 62 65 63 61  .    ** But beca
0d60: 75 73 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  use db->init.bus
0d70: 79 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 6e  y is set to 1, n
0d80: 6f 20 56 44 42 45 20 63 6f 64 65 20 69 73 20 67  o VDBE code is g
0d90: 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
0da0: 6f 72 20 65 78 65 63 75 74 65 64 2e 20 20 41 6c  or executed.  Al
0db0: 6c 20 74 68 65 20 70 61 72 73 65 72 20 64 6f 65  l the parser doe
0dc0: 73 20 69 73 20 62 75 69 6c 64 20 74 68 65 20 69  s is build the i
0dd0: 6e 74 65 72 6e 61 6c 20 64 61 74 61 0a 20 20 20  nternal data.   
0de0: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 74   ** structures t
0df0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
0e00: 20 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 6f   table, index, o
0e10: 72 20 76 69 65 77 2e 0a 20 20 20 20 2a 2f 0a 20  r view..    */. 
0e20: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
0e30: 38 20 73 61 76 65 64 5f 69 44 62 20 3d 20 64 62  8 saved_iDb = db
0e40: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
0e50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0e60: 74 6d 74 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c  tmt;.    TESTONL
0e70: 59 28 69 6e 74 20 72 63 70 29 3b 20 20 20 20 20  Y(int rcp);     
0e80: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0e90: 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
0ea0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
0eb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
0ec0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
0ed0: 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
0ee0: 20 69 44 62 3b 0a 20 20 20 20 64 62 2d 3e 69 6e   iDb;.    db->in
0ef0: 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 73 71 6c  it.newTnum = sql
0f00: 69 74 65 33 41 74 6f 69 28 61 72 67 76 5b 31 5d  ite3Atoi(argv[1]
0f10: 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  );.    db->init.
0f20: 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d 20  orphanTrigger = 
0f30: 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59 28  0;.    TESTONLY(
0f40: 72 63 70 20 3d 20 29 20 73 71 6c 69 74 65 33 5f  rcp = ) sqlite3_
0f50: 70 72 65 70 61 72 65 28 64 62 2c 20 61 72 67 76  prepare(db, argv
0f60: 5b 32 5d 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  [2], -1, &pStmt,
0f70: 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
0f80: 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 61  ->errCode;.    a
0f90: 73 73 65 72 74 28 20 28 72 63 26 30 78 46 46 29  ssert( (rc&0xFF)
0fa0: 3d 3d 28 72 63 70 26 30 78 46 46 29 20 29 3b 0a  ==(rcp&0xFF) );.
0fb0: 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62      db->init.iDb
0fc0: 20 3d 20 73 61 76 65 64 5f 69 44 62 3b 0a 20 20   = saved_iDb;.  
0fd0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 61 76    /* assert( sav
0fe0: 65 64 5f 69 44 62 3d 3d 30 20 7c 7c 20 28 64 62  ed_iDb==0 || (db
0ff0: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46  ->mDbFlags & DBF
1000: 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d 30 20 29  LAG_Vacuum)!=0 )
1010: 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  ; */.    if( SQL
1020: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1030: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1040: 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20 29  .orphanTrigger )
1050: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1060: 28 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ( iDb==1 );.    
1070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1080: 20 70 44 61 74 61 2d 3e 72 63 20 3d 20 72 63 3b   pData->rc = rc;
1090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
10a0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
10b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10c0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
10d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54  ( rc!=SQLITE_INT
10f0: 45 52 52 55 50 54 20 26 26 20 28 72 63 26 30 78  ERRUPT && (rc&0x
1100: 46 46 29 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b  FF)!=SQLITE_LOCK
1110: 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
1120: 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28 70 44  corruptSchema(pD
1130: 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20 73 71  ata, argv[0], sq
1140: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1150: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1160: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1170: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1180: 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pStmt);.  }else 
1190: 69 66 28 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c  if( argv[0]==0 |
11a0: 7c 20 28 61 72 67 76 5b 32 5d 21 3d 30 20 26 26  | (argv[2]!=0 &&
11b0: 20 61 72 67 76 5b 32 5d 5b 30 5d 21 3d 30 29 20   argv[2][0]!=0) 
11c0: 29 7b 0a 20 20 20 20 63 6f 72 72 75 70 74 53 63  ){.    corruptSc
11d0: 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76  hema(pData, argv
11e0: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
11f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
1200: 53 51 4c 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6c  SQL column is bl
1210: 61 6e 6b 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ank it means thi
1220: 73 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  s is an index th
1230: 61 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 63 72  at.    ** was cr
1240: 65 61 74 65 64 20 74 6f 20 62 65 20 74 68 65 20  eated to be the 
1250: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 74  PRIMARY KEY or t
1260: 6f 20 66 75 6c 66 69 6c 6c 20 61 20 55 4e 49 51  o fulfill a UNIQ
1270: 55 45 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  UE.    ** constr
1280: 61 69 6e 74 20 66 6f 72 20 61 20 43 52 45 41 54  aint for a CREAT
1290: 45 20 54 41 42 4c 45 2e 20 20 54 68 65 20 69 6e  E TABLE.  The in
12a0: 64 65 78 20 73 68 6f 75 6c 64 20 68 61 76 65 20  dex should have 
12b0: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 62  already.    ** b
12c0: 65 65 6e 20 63 72 65 61 74 65 64 20 77 68 65 6e  een created when
12d0: 20 77 65 20 70 72 6f 63 65 73 73 65 64 20 74 68   we processed th
12e0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 2e 20  e CREATE TABLE. 
12f0: 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 20   All we have.   
1300: 20 2a 2a 20 74 6f 20 64 6f 20 68 65 72 65 20 69   ** to do here i
1310: 73 20 72 65 63 6f 72 64 20 74 68 65 20 72 6f 6f  s record the roo
1320: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t page number fo
1330: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 20 20  r that index..  
1340: 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
1350: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64  pIndex;.    pInd
1360: 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
1370: 49 6e 64 65 78 28 64 62 2c 20 61 72 67 76 5b 30  Index(db, argv[0
1380: 5d 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ], db->aDb[iDb].
1390: 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 69  zDbSName);.    i
13a0: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
13b0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
13c0: 6e 20 6f 63 63 75 72 20 69 66 20 74 68 65 72 65  n occur if there
13d0: 20 65 78 69 73 74 73 20 61 6e 20 69 6e 64 65 78   exists an index
13e0: 20 6f 6e 20 61 20 54 45 4d 50 20 74 61 62 6c 65   on a TEMP table
13f0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20   which.      ** 
1400: 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
1410: 65 20 61 73 20 61 6e 6f 74 68 65 72 20 69 6e 64  e as another ind
1420: 65 78 20 6f 6e 20 61 20 70 65 72 6d 61 6e 65 6e  ex on a permanen
1430: 74 20 69 6e 64 65 78 2e 20 20 53 69 6e 63 65 0a  t index.  Since.
1440: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72        ** the per
1450: 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20  manent table is 
1460: 68 69 64 64 65 6e 20 62 79 20 74 68 65 20 54 45  hidden by the TE
1470: 4d 50 20 74 61 62 6c 65 2c 20 77 65 20 63 61 6e  MP table, we can
1480: 20 61 6c 73 6f 0a 20 20 20 20 20 20 2a 2a 20 73   also.      ** s
1490: 61 66 65 6c 79 20 69 67 6e 6f 72 65 20 74 68 65  afely ignore the
14a0: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 70 65   index on the pe
14b0: 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20  rmanent table.. 
14c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a       */.      /*
14d0: 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 3b 0a   Do Nothing */;.
14e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
14f0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 61 72  lite3GetInt32(ar
1500: 67 76 5b 31 5d 2c 20 26 70 49 6e 64 65 78 2d 3e  gv[1], &pIndex->
1510: 74 6e 75 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tnum)==0 ){.    
1520: 20 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28    corruptSchema(
1530: 70 44 61 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20  pData, argv[0], 
1540: 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61 67  "invalid rootpag
1550: 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  e");.    }.  }..
1560: 20 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20    if( iDb!=1 && 
1570: 28 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  (db->openFlags &
1580: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 55   SQLITE_OPEN_REU
1590: 53 45 5f 53 43 48 45 4d 41 29 20 29 7b 0a 20 20  SE_SCHEMA) ){.  
15a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 68    /* If this sch
15b0: 65 6d 61 20 6d 69 67 68 74 20 62 65 20 75 73 65  ema might be use
15c0: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 63 6f  d by multiple co
15d0: 6e 6e 65 63 74 69 6f 6e 73 2c 20 65 6e 73 75 72  nnections, ensur
15e0: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
15f0: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
1600: 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 68  g is allocated h
1610: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
1620: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 0a 20  there might be. 
1630: 20 20 20 2a 2a 20 61 20 72 61 63 65 20 63 6f 6e     ** a race con
1640: 64 69 74 69 6f 6e 20 77 68 65 72 65 20 74 77 6f  dition where two
1650: 20 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74   threads attempt
1660: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a   to allocate it.
1670: 20 20 20 20 2a 2a 20 73 69 6d 75 6c 74 61 6e 65      ** simultane
1680: 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 49  ously.  */.    I
1690: 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73  ndex *pIndex = s
16a0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
16b0: 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 64 62 2d  db, argv[0], db-
16c0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
16d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  me);.    if( pIn
16e0: 64 65 78 20 29 20 73 71 6c 69 74 65 33 49 6e 64  dex ) sqlite3Ind
16f0: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 64 62  exAffinityStr(db
1700: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  , pIndex);.    s
1710: 63 68 65 6d 61 55 70 64 61 74 65 43 68 65 63 6b  chemaUpdateCheck
1720: 73 75 6d 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  sum(db->aDb[iDb]
1730: 2e 70 53 63 68 65 6d 61 2c 20 61 72 67 76 5b 30  .pSchema, argv[0
1740: 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 76  ], argv[1], argv
1750: 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [2]);.  }.  retu
1760: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1770: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
1780: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1790: 6d 61 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ma and initializ
17a0: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 64 61  e internal.** da
17b0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
17c0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
17d0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 69  ase file.  The i
17e0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
17f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1800: 67 69 76 65 6e 20 62 79 20 69 44 62 2e 20 20 69  given by iDb.  i
1810: 44 62 3d 3d 30 20 69 73 20 75 73 65 64 20 66 6f  Db==0 is used fo
1820: 72 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 61  r the main.** da
1830: 74 61 62 61 73 65 2e 20 20 69 44 62 3d 3d 31 20  tabase.  iDb==1 
1840: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
1850: 75 73 65 64 2e 20 20 69 44 62 3e 3d 32 20 69 73  used.  iDb>=2 is
1860: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 75 78   used for.** aux
1870: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1880: 2e 20 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  .  Return one of
1890: 20 74 68 65 20 53 51 4c 49 54 45 5f 20 65 72 72   the SQLITE_ err
18a0: 6f 72 20 63 6f 64 65 73 20 74 6f 0a 2a 2a 20 69  or codes to.** i
18b0: 6e 64 69 63 61 74 65 20 73 75 63 63 65 73 73 20  ndicate success 
18c0: 6f 72 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 69  or failure..*/.i
18d0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e  nt sqlite3InitOn
18e0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
18f0: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 2a 70  nt iDb, char **p
1900: 7a 45 72 72 4d 73 67 2c 20 75 33 32 20 6d 46 6c  zErrMsg, u32 mFl
1910: 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1920: 20 20 69 6e 74 20 69 3b 0a 23 69 66 6e 64 65 66    int i;.#ifndef
1930: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1940: 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 73 69  RECATED.  int si
1950: 7a 65 3b 0a 23 65 6e 64 69 66 0a 20 20 44 62 20  ze;.#endif.  Db 
1960: 2a 70 44 62 3b 0a 20 20 63 68 61 72 20 63 6f 6e  *pDb;.  char con
1970: 73 74 20 2a 61 7a 41 72 67 5b 34 5d 3b 0a 20 20  st *azArg[4];.  
1980: 69 6e 74 20 6d 65 74 61 5b 35 5d 3b 0a 20 20 49  int meta[5];.  I
1990: 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74 61  nitData initData
19a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19b0: 7a 4d 61 73 74 65 72 4e 61 6d 65 3b 0a 20 20 69  zMasterName;.  i
19c0: 6e 74 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63  nt openedTransac
19d0: 74 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73  tion = 0;..  ass
19e0: 65 72 74 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61  ert( (db->mDbFla
19f0: 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65  gs & DBFLAG_Sche
1a00: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 29 3b  maKnownOk)==0 );
1a10: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
1a20: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
1a30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
1a40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1a50: 6d 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ma );.  assert( 
1a60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a70: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
1a80: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
1a90: 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  1 || sqlite3Btre
1aa0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e  eHoldsMutex(db->
1ab0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b  aDb[iDb].pBt) );
1ac0: 0a 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  ..  db->init.bus
1ad0: 79 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  y = 1;..  /* Con
1ae0: 73 74 72 75 63 74 20 74 68 65 20 69 6e 2d 6d 65  struct the in-me
1af0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
1b00: 69 6f 6e 20 73 63 68 65 6d 61 20 74 61 62 6c 65  ion schema table
1b10: 73 20 28 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  s (sqlite_master
1b20: 20 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f   or.  ** sqlite_
1b30: 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 62 79 20  temp_master) by 
1b40: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 70 61 72  invoking the par
1b50: 73 65 72 20 64 69 72 65 63 74 6c 79 2e 20 20 54  ser directly.  T
1b60: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  he appropriate. 
1b70: 20 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 20 77   ** table name w
1b80: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
1b90: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
1ba0: 20 74 68 65 20 70 61 72 73 65 72 20 73 6f 20 77   the parser so w
1bb0: 65 20 63 61 6e 20 6a 75 73 74 0a 20 20 2a 2a 20  e can just.  ** 
1bc0: 75 73 65 20 74 68 65 20 61 62 62 72 65 76 69 61  use the abbrevia
1bd0: 74 69 6f 6e 20 22 78 22 20 68 65 72 65 2e 20 20  tion "x" here.  
1be0: 54 68 65 20 70 61 72 73 65 72 20 77 69 6c 6c 20  The parser will 
1bf0: 61 6c 73 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  also automatical
1c00: 6c 79 20 74 61 67 0a 20 20 2a 2a 20 74 68 65 20  ly tag.  ** the 
1c10: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 61 73 20  schema table as 
1c20: 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
1c30: 61 7a 41 72 67 5b 30 5d 20 3d 20 7a 4d 61 73 74  azArg[0] = zMast
1c40: 65 72 4e 61 6d 65 20 3d 20 53 43 48 45 4d 41 5f  erName = SCHEMA_
1c50: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 61 7a  TABLE(iDb);.  az
1c60: 41 72 67 5b 31 5d 20 3d 20 22 31 22 3b 0a 20 20  Arg[1] = "1";.  
1c70: 61 7a 41 72 67 5b 32 5d 20 3d 20 22 43 52 45 41  azArg[2] = "CREA
1c80: 54 45 20 54 41 42 4c 45 20 78 28 74 79 70 65 20  TE TABLE x(type 
1c90: 74 65 78 74 2c 6e 61 6d 65 20 74 65 78 74 2c 74  text,name text,t
1ca0: 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 22 0a 20  bl_name text,". 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6f 74             "root
1cd0: 70 61 67 65 20 69 6e 74 2c 73 71 6c 20 74 65 78  page int,sql tex
1ce0: 74 29 22 3b 0a 20 20 61 7a 41 72 67 5b 33 5d 20  t)";.  azArg[3] 
1cf0: 3d 20 30 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e  = 0;.  initData.
1d00: 64 62 20 3d 20 64 62 3b 0a 20 20 69 6e 69 74 44  db = db;.  initD
1d10: 61 74 61 2e 69 44 62 20 3d 20 69 44 62 3b 0a 20  ata.iDb = iDb;. 
1d20: 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d 20 53   initData.rc = S
1d30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 69 74  QLITE_OK;.  init
1d40: 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20  Data.pzErrMsg = 
1d50: 70 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 69 74  pzErrMsg;.  init
1d60: 44 61 74 61 2e 6d 49 6e 69 74 46 6c 61 67 73 20  Data.mInitFlags 
1d70: 3d 20 6d 46 6c 61 67 73 3b 0a 20 20 73 71 6c 69  = mFlags;.  sqli
1d80: 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28  te3InitCallback(
1d90: 26 69 6e 69 74 44 61 74 61 2c 20 33 2c 20 28 63  &initData, 3, (c
1da0: 68 61 72 20 2a 2a 29 61 7a 41 72 67 2c 20 30 29  har **)azArg, 0)
1db0: 3b 0a 20 20 69 66 28 20 69 6e 69 74 44 61 74 61  ;.  if( initData
1dc0: 2e 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  .rc ){.    rc = 
1dd0: 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20  initData.rc;.   
1de0: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1df0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
1e00: 65 20 61 20 63 75 72 73 6f 72 20 74 6f 20 68 6f  e a cursor to ho
1e10: 6c 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ld the database 
1e20: 6f 70 65 6e 0a 20 20 2a 2f 0a 20 20 70 44 62 20  open.  */.  pDb 
1e30: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
1e40: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d  .  if( pDb->pBt=
1e50: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1e60: 28 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ( iDb==1 );.    
1e70: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
1e80: 2c 20 31 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 1, DB_SchemaLo
1e90: 61 64 65 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  aded);.    rc = 
1ea0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
1eb0: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1ec0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1ed0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1ee0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f 72   a read-only (or
1ef0: 20 72 65 61 64 2d 77 72 69 74 65 29 20 74 72 61   read-write) tra
1f00: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 0a  nsaction opened.
1f10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62 2d 74 72    ** on the b-tr
1f20: 65 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70 65  ee database, ope
1f30: 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61 20  n one now. If a 
1f40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
1f50: 70 65 6e 65 64 2c 20 69 74 20 0a 20 20 2a 2a 20  pened, it .  ** 
1f60: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 64 20 62  will be closed b
1f70: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1f80: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 20 2a 2f  ion returns.  */
1f90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1fa0: 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  nter(pDb->pBt);.
1fb0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 74    if( !sqlite3Bt
1fc0: 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
1fd0: 28 70 44 62 2d 3e 70 42 74 29 20 29 7b 0a 20 20  (pDb->pBt) ){.  
1fe0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ff0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 44  reeBeginTrans(pD
2000: 62 2d 3e 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  b->pBt, 0, 0);. 
2010: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2020: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2030: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70  lite3SetString(p
2040: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 73 71 6c  zErrMsg, db, sql
2050: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
2060: 0a 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69 74  .      goto init
2070: 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  one_error_out;. 
2080: 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 65 64 54     }.    openedT
2090: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 31 3b 0a  ransaction = 1;.
20a0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68    }..  /* Get th
20b0: 65 20 64 61 74 61 62 61 73 65 20 6d 65 74 61 20  e database meta 
20c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
20d0: 2a 0a 20 20 2a 2a 20 4d 65 74 61 20 76 61 6c 75  *.  ** Meta valu
20e0: 65 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77  es are as follow
20f0: 73 3a 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b  s:.  **    meta[
2100: 30 5d 20 20 20 53 63 68 65 6d 61 20 63 6f 6f 6b  0]   Schema cook
2110: 69 65 2e 20 20 43 68 61 6e 67 65 73 20 77 69 74  ie.  Changes wit
2120: 68 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  h each schema ch
2130: 61 6e 67 65 2e 0a 20 20 2a 2a 20 20 20 20 6d 65  ange..  **    me
2140: 74 61 5b 31 5d 20 20 20 46 69 6c 65 20 66 6f 72  ta[1]   File for
2150: 6d 61 74 20 6f 66 20 73 63 68 65 6d 61 20 6c 61  mat of schema la
2160: 79 65 72 2e 0a 20 20 2a 2a 20 20 20 20 6d 65 74  yer..  **    met
2170: 61 5b 32 5d 20 20 20 53 69 7a 65 20 6f 66 20 74  a[2]   Size of t
2180: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  he page cache.. 
2190: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 33 5d 20 20   **    meta[3]  
21a0: 20 4c 61 72 67 65 73 74 20 72 6f 6f 74 70 61 67   Largest rootpag
21b0: 65 20 28 61 75 74 6f 2f 69 6e 63 72 5f 76 61 63  e (auto/incr_vac
21c0: 75 75 6d 20 6d 6f 64 65 29 0a 20 20 2a 2a 20 20  uum mode).  **  
21d0: 20 20 6d 65 74 61 5b 34 5d 20 20 20 44 62 20 74    meta[4]   Db t
21e0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20 31 3a  ext encoding. 1:
21f0: 55 54 46 2d 38 20 32 3a 55 54 46 2d 31 36 4c 45  UTF-8 2:UTF-16LE
2200: 20 33 3a 55 54 46 2d 31 36 42 45 0a 20 20 2a 2a   3:UTF-16BE.  **
2210: 20 20 20 20 6d 65 74 61 5b 35 5d 20 20 20 55 73      meta[5]   Us
2220: 65 72 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20  er version.  ** 
2230: 20 20 20 6d 65 74 61 5b 36 5d 20 20 20 49 6e 63     meta[6]   Inc
2240: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
2250: 6d 6f 64 65 0a 20 20 2a 2a 20 20 20 20 6d 65 74  mode.  **    met
2260: 61 5b 37 5d 20 20 20 75 6e 75 73 65 64 0a 20 20  a[7]   unused.  
2270: 2a 2a 20 20 20 20 6d 65 74 61 5b 38 5d 20 20 20  **    meta[8]   
2280: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20 20 6d  unused.  **    m
2290: 65 74 61 5b 39 5d 20 20 20 75 6e 75 73 65 64 0a  eta[9]   unused.
22a0: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
22b0: 54 68 65 20 23 64 65 66 69 6e 65 64 20 53 51 4c  The #defined SQL
22c0: 49 54 45 5f 55 54 46 2a 20 73 79 6d 62 6f 6c 73  ITE_UTF* symbols
22d0: 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
22e0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a 20 20  correspond to.  
22f0: 2a 2a 20 74 68 65 20 70 6f 73 73 69 62 6c 65 20  ** the possible 
2300: 76 61 6c 75 65 73 20 6f 66 20 6d 65 74 61 5b 34  values of meta[4
2310: 5d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ]..  */.  for(i=
2320: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 6d  0; i<ArraySize(m
2330: 65 74 61 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eta); i++){.    
2340: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
2350: 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 69 2b  eta(pDb->pBt, i+
2360: 31 2c 20 28 75 33 32 20 2a 29 26 6d 65 74 61 5b  1, (u32 *)&meta[
2370: 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  i]);.  }.  if( (
2380: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2390: 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
23a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  )!=0 ){.    mems
23b0: 65 74 28 6d 65 74 61 2c 20 30 2c 20 73 69 7a 65  et(meta, 0, size
23c0: 6f 66 28 6d 65 74 61 29 29 3b 0a 20 20 7d 0a 20  of(meta));.  }. 
23d0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73   pDb->pSchema->s
23e0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 6d  chema_cookie = m
23f0: 65 74 61 5b 42 54 52 45 45 5f 53 43 48 45 4d 41  eta[BTREE_SCHEMA
2400: 5f 56 45 52 53 49 4f 4e 2d 31 5d 3b 0a 0a 20 20  _VERSION-1];..  
2410: 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 61 20  /* If opening a 
2420: 6e 6f 6e 2d 65 6d 70 74 79 20 64 61 74 61 62 61  non-empty databa
2430: 73 65 2c 20 63 68 65 63 6b 20 74 68 65 20 74 65  se, check the te
2440: 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20 46 6f 72  xt encoding. For
2450: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20 64   the.  ** main d
2460: 61 74 61 62 61 73 65 2c 20 73 65 74 20 73 71 6c  atabase, set sql
2470: 69 74 65 33 2e 65 6e 63 20 74 6f 20 74 68 65 20  ite3.enc to the 
2480: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
2490: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  main database.. 
24a0: 20 2a 2a 20 46 6f 72 20 61 6e 20 61 74 74 61 63   ** For an attac
24b0: 68 65 64 20 64 62 2c 20 69 74 20 69 73 20 61 6e  hed db, it is an
24c0: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 65 6e   error if the en
24d0: 63 6f 64 69 6e 67 20 69 73 20 6e 6f 74 20 74 68  coding is not th
24e0: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 73  e same.  ** as s
24f0: 71 6c 69 74 65 33 2e 65 6e 63 2e 0a 20 20 2a 2f  qlite3.enc..  */
2500: 0a 20 20 69 66 28 20 6d 65 74 61 5b 42 54 52 45  .  if( meta[BTRE
2510: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2d  E_TEXT_ENCODING-
2520: 31 5d 20 29 7b 20 20 2f 2a 20 74 65 78 74 20 65  1] ){  /* text e
2530: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 69  ncoding */.    i
2540: 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 23 69 66  f( iDb==0 ){.#if
2550: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2560: 5f 55 54 46 31 36 0a 20 20 20 20 20 20 75 38 20  _UTF16.      u8 
2570: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20  encoding;.      
2580: 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 74 68  /* If opening th
2590: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c  e main database,
25a0: 20 73 65 74 20 45 4e 43 28 64 62 29 2e 20 2a 2f   set ENC(db). */
25b0: 0a 20 20 20 20 20 20 65 6e 63 6f 64 69 6e 67 20  .      encoding 
25c0: 3d 20 28 75 38 29 6d 65 74 61 5b 42 54 52 45 45  = (u8)meta[BTREE
25d0: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2d 31  _TEXT_ENCODING-1
25e0: 5d 20 26 20 33 3b 0a 20 20 20 20 20 20 69 66 28  ] & 3;.      if(
25f0: 20 65 6e 63 6f 64 69 6e 67 3d 3d 30 20 29 20 65   encoding==0 ) e
2600: 6e 63 6f 64 69 6e 67 20 3d 20 53 51 4c 49 54 45  ncoding = SQLITE
2610: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 45 4e 43  _UTF8;.      ENC
2620: 28 64 62 29 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  (db) = encoding;
2630: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 45 4e 43  .#else.      ENC
2640: 28 64 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  (db) = SQLITE_UT
2650: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  F8;.#endif.    }
2660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
2670: 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 61 74 74  f opening an att
2680: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2c 20  ached database, 
2690: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6d 75 63  the encoding muc
26a0: 68 20 6d 61 74 63 68 20 45 4e 43 28 64 62 29 20  h match ENC(db) 
26b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 65 74  */.      if( met
26c0: 61 5b 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43  a[BTREE_TEXT_ENC
26d0: 4f 44 49 4e 47 2d 31 5d 21 3d 45 4e 43 28 64 62  ODING-1]!=ENC(db
26e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
26f0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a  ite3SetString(pz
2700: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 61 74 74  ErrMsg, db, "att
2710: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
2720: 6d 75 73 74 20 75 73 65 20 74 68 65 20 73 61 6d  must use the sam
2730: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e".            "
2740: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
2750: 73 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 22  s main database"
2760: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2770: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2780: 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69 74 6f        goto inito
2790: 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  ne_error_out;.  
27a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
27b0: 6c 73 65 7b 0a 20 20 20 20 44 62 53 65 74 50 72  lse{.    DbSetPr
27c0: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
27d0: 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20 7d 0a 20  DB_Empty);.  }. 
27e0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 65   pDb->pSchema->e
27f0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 0a 20  nc = ENC(db);.. 
2800: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
2810: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3d 3d 30  a->cache_size==0
2820: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2830: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
2840: 45 44 0a 20 20 20 20 73 69 7a 65 20 3d 20 73 71  ED.    size = sq
2850: 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 6d 65  lite3AbsInt32(me
2860: 74 61 5b 42 54 52 45 45 5f 44 45 46 41 55 4c 54  ta[BTREE_DEFAULT
2870: 5f 43 41 43 48 45 5f 53 49 5a 45 2d 31 5d 29 3b  _CACHE_SIZE-1]);
2880: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3d 3d 30  .    if( size==0
2890: 20 29 7b 20 73 69 7a 65 20 3d 20 53 51 4c 49 54   ){ size = SQLIT
28a0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
28b0: 53 49 5a 45 3b 20 7d 0a 20 20 20 20 70 44 62 2d  SIZE; }.    pDb-
28c0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
28d0: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 23 65 6c  size = size;.#el
28e0: 73 65 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  se.    pDb->pSch
28f0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  ema->cache_size 
2900: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2910: 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 23 65 6e  _CACHE_SIZE;.#en
2920: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 42  dif.    sqlite3B
2930: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
2940: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
2950: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
2960: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize);.  }..  /*.
2970: 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74    ** file_format
2980: 3d 3d 31 20 20 20 20 56 65 72 73 69 6f 6e 20 33  ==1    Version 3
2990: 2e 30 2e 30 2e 0a 20 20 2a 2a 20 66 69 6c 65 5f  .0.0..  ** file_
29a0: 66 6f 72 6d 61 74 3d 3d 32 20 20 20 20 56 65 72  format==2    Ver
29b0: 73 69 6f 6e 20 33 2e 31 2e 33 2e 20 20 2f 2f 20  sion 3.1.3.  // 
29c0: 41 4c 54 45 52 20 54 41 42 4c 45 20 41 44 44 20  ALTER TABLE ADD 
29d0: 43 4f 4c 55 4d 4e 0a 20 20 2a 2a 20 66 69 6c 65  COLUMN.  ** file
29e0: 5f 66 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56 65  _format==3    Ve
29f0: 72 73 69 6f 6e 20 33 2e 31 2e 34 2e 20 20 2f 2f  rsion 3.1.4.  //
2a00: 20 64 69 74 74 6f 20 62 75 74 20 77 69 74 68 20   ditto but with 
2a10: 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74  non-NULL default
2a20: 73 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d  s.  ** file_form
2a30: 61 74 3d 3d 34 20 20 20 20 56 65 72 73 69 6f 6e  at==4    Version
2a40: 20 33 2e 33 2e 30 2e 20 20 2f 2f 20 44 45 53 43   3.3.0.  // DESC
2a50: 20 69 6e 64 69 63 65 73 2e 20 20 42 6f 6f 6c 65   indices.  Boole
2a60: 61 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  an constants.  *
2a70: 2f 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  /.  pDb->pSchema
2a80: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20  ->file_format = 
2a90: 28 75 38 29 6d 65 74 61 5b 42 54 52 45 45 5f 46  (u8)meta[BTREE_F
2aa0: 49 4c 45 5f 46 4f 52 4d 41 54 2d 31 5d 3b 0a 20  ILE_FORMAT-1];. 
2ab0: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
2ac0: 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d  a->file_format==
2ad0: 30 20 29 7b 0a 20 20 20 20 70 44 62 2d 3e 70 53  0 ){.    pDb->pS
2ae0: 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
2af0: 61 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  at = 1;.  }.  if
2b00: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
2b10: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 53 51 4c 49  file_format>SQLI
2b20: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
2b30: 41 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  AT ){.    sqlite
2b40: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
2b50: 4d 73 67 2c 20 64 62 2c 20 22 75 6e 73 75 70 70  Msg, db, "unsupp
2b60: 6f 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d 61  orted file forma
2b70: 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t");.    rc = SQ
2b80: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2b90: 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72 72  goto initone_err
2ba0: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
2bb0: 2a 20 54 69 63 6b 65 74 20 23 32 38 30 34 3a 20  * Ticket #2804: 
2bc0: 20 57 68 65 6e 20 77 65 20 6f 70 65 6e 20 61 20   When we open a 
2bd0: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
2be0: 6e 65 77 65 72 20 66 69 6c 65 20 66 6f 72 6d 61  newer file forma
2bf0: 74 2c 0a 20 20 2a 2a 20 63 6c 65 61 72 20 74 68  t,.  ** clear th
2c00: 65 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f 66 6f  e legacy_file_fo
2c10: 72 6d 61 74 20 70 72 61 67 6d 61 20 66 6c 61 67  rmat pragma flag
2c20: 20 73 6f 20 74 68 61 74 20 61 20 56 41 43 55 55   so that a VACUU
2c30: 4d 20 77 69 6c 6c 0a 20 20 2a 2a 20 6e 6f 74 20  M will.  ** not 
2c40: 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 64 61  downgrade the da
2c50: 74 61 62 61 73 65 20 61 6e 64 20 74 68 75 73 20  tabase and thus 
2c60: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 64  invalidate any d
2c70: 65 73 63 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 69  escending.  ** i
2c80: 6e 64 69 63 65 73 20 74 68 61 74 20 74 68 65 20  ndices that the 
2c90: 75 73 65 72 20 6d 69 67 68 74 20 68 61 76 65 20  user might have 
2ca0: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
2cb0: 69 66 28 20 69 44 62 3d 3d 30 20 26 26 20 6d 65  if( iDb==0 && me
2cc0: 74 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  ta[BTREE_FILE_FO
2cd0: 52 4d 41 54 2d 31 5d 3e 3d 34 20 29 7b 0a 20 20  RMAT-1]>=4 ){.  
2ce0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2cf0: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
2d00: 65 46 6d 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eFmt;.  }..  /* 
2d10: 52 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  Read the schema 
2d20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
2d30: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 61  of the schema ta
2d40: 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  bles.  */.  asse
2d50: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
2d60: 79 20 29 3b 0a 20 20 7b 0a 20 20 20 20 63 68 61  y );.  {.    cha
2d70: 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 7a 53 71  r *zSql;.    zSq
2d80: 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
2d90: 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
2da0: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f  "SELECT name, ro
2db0: 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d  otpage, sql FROM
2dc0: 20 5c 22 25 77 5c 22 2e 25 73 20 4f 52 44 45 52   \"%w\".%s ORDER
2dd0: 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
2de0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
2df0: 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74  .zDbSName, zMast
2e00: 65 72 4e 61 6d 65 29 3b 0a 23 69 66 6e 64 65 66  erName);.#ifndef
2e10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e20: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 7b  HORIZATION.    {
2e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 78  .      sqlite3_x
2e40: 61 75 74 68 20 78 41 75 74 68 3b 0a 20 20 20 20  auth xAuth;.    
2e50: 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
2e60: 75 74 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78  uth;.      db->x
2e70: 41 75 74 68 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Auth = 0;.#endif
2e80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e90: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2ea0: 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61  l, sqlite3InitCa
2eb0: 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74  llback, &initDat
2ec0: 61 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  a, 0);.#ifndef S
2ed0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
2ee0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 64  RIZATION.      d
2ef0: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
2f00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2f10: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f20: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74  E_OK ) rc = init
2f30: 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 73 71 6c  Data.rc;.    sql
2f40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2f50: 53 71 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Sql);.#ifndef SQ
2f60: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
2f70: 45 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  E.    if( rc==SQ
2f80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f90: 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73   sqlite3Analysis
2fa0: 4c 6f 61 64 28 64 62 2c 20 69 44 62 29 3b 0a 20  Load(db, iDb);. 
2fb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2fc0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2fd0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63  Failed ){.    rc
2fe0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2ff0: 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  BKPT;.    sqlite
3000: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
3010: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
3020: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
3030: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 64 62  SQLITE_OK || (db
3040: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4e  ->flags&SQLITE_N
3050: 6f 53 63 68 65 6d 61 45 72 72 6f 72 29 29 7b 0a  oSchemaError)){.
3060: 20 20 20 20 2f 2a 20 42 6c 61 63 6b 20 6d 61 67      /* Black mag
3070: 69 63 3a 20 49 66 20 74 68 65 20 53 51 4c 49 54  ic: If the SQLIT
3080: 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f 72 20  E_NoSchemaError 
3090: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
30a0: 6e 20 63 6f 6e 73 69 64 65 72 0a 20 20 20 20 2a  n consider.    *
30b0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f 61  * the schema loa
30c0: 64 65 64 2c 20 65 76 65 6e 20 69 66 20 65 72 72  ded, even if err
30d0: 6f 72 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e  ors occurred. In
30e0: 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20   this situation 
30f0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72  the .    ** curr
3100: 65 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ent sqlite3_prep
3110: 61 72 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20  are() operation 
3120: 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74 20 74  will fail, but t
3130: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 65  he following one
3140: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 61 74 74  .    ** will att
3150: 65 6d 70 74 20 74 6f 20 63 6f 6d 70 69 6c 65 20  empt to compile 
3160: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 74 61  the supplied sta
3170: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 77  tement against w
3180: 68 61 74 65 76 65 72 20 73 75 62 73 65 74 0a 20  hatever subset. 
3190: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68     ** of the sch
31a0: 65 6d 61 20 77 61 73 20 6c 6f 61 64 65 64 20 62  ema was loaded b
31b0: 65 66 6f 72 65 20 74 68 65 20 65 72 72 6f 72 20  efore the error 
31c0: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 70 72  occurred. The pr
31d0: 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 70 75 72  imary.    ** pur
31e0: 70 6f 73 65 20 6f 66 20 74 68 69 73 20 69 73 20  pose of this is 
31f0: 74 6f 20 61 6c 6c 6f 77 20 61 63 63 65 73 73 20  to allow access 
3200: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  to the sqlite_ma
3210: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a  ster table.    *
3220: 2a 20 65 76 65 6e 20 77 68 65 6e 20 69 74 73 20  * even when its 
3230: 63 6f 6e 74 65 6e 74 73 20 68 61 76 65 20 62 65  contents have be
3240: 65 6e 20 63 6f 72 72 75 70 74 65 64 2e 0a 20 20  en corrupted..  
3250: 20 20 2a 2f 0a 20 20 20 20 44 62 53 65 74 50 72    */.    DbSetPr
3260: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
3270: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
3280: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
3290: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
32a0: 20 69 44 62 21 3d 31 20 26 26 20 28 64 62 2d 3e   iDb!=1 && (db->
32b0: 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
32c0: 54 45 5f 4f 50 45 4e 5f 52 45 55 53 45 5f 53 43  TE_OPEN_REUSE_SC
32d0: 48 45 4d 41 29 20 29 7b 0a 20 20 20 20 73 71 6c  HEMA) ){.    sql
32e0: 69 74 65 33 53 63 68 65 6d 61 52 65 75 73 65 28  ite3SchemaReuse(
32f0: 64 62 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 0a 20  db, iDb);.  }.. 
3300: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
3310: 72 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20  r an error that 
3320: 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 75 63  occurs after suc
3330: 63 65 73 73 66 75 6c 6c 79 20 61 6c 6c 6f 63 61  cessfully alloca
3340: 74 69 6e 67 0a 20 20 2a 2a 20 63 75 72 4d 61 69  ting.  ** curMai
3350: 6e 20 61 6e 64 20 63 61 6c 6c 69 6e 67 20 73 71  n and calling sq
3360: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
3370: 29 2e 20 46 6f 72 20 61 6e 20 65 72 72 6f 72 20  ). For an error 
3380: 74 68 61 74 20 6f 63 63 75 72 73 0a 20 20 2a 2a  that occurs.  **
3390: 20 62 65 66 6f 72 65 20 74 68 61 74 20 70 6f 69   before that poi
33a0: 6e 74 2c 20 6a 75 6d 70 20 74 6f 20 65 72 72 6f  nt, jump to erro
33b0: 72 5f 6f 75 74 2e 0a 20 20 2a 2f 0a 69 6e 69 74  r_out..  */.init
33c0: 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  one_error_out:. 
33d0: 20 69 66 28 20 6f 70 65 6e 65 64 54 72 61 6e 73   if( openedTrans
33e0: 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71  action ){.    sq
33f0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
3400: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pDb->pBt);.  }.
3410: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
3420: 61 76 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 0a  ave(pDb->pBt);..
3430: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28  error_out:.  if(
3440: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
3450: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
3460: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  || rc==SQLITE_IO
3470: 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
3480: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
3490: 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
34a0: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e    sqlite3ResetOn
34b0: 65 53 63 68 65 6d 61 28 64 62 2c 20 69 44 62 29  eSchema(db, iDb)
34c0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 69 6e 69 74  ;.  }.  db->init
34d0: 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20 72 65 74  .busy = 0;.  ret
34e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   Initialize all 
3500: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 2d  database files -
3510: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
3520: 73 65 20 66 69 6c 65 2c 20 74 68 65 20 66 69 6c  se file, the fil
3530: 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  e.** used to sto
3540: 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  re temporary tab
3550: 6c 65 73 2c 20 61 6e 64 20 61 6e 79 20 61 64 64  les, and any add
3560: 69 74 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65  itional database
3570: 20 66 69 6c 65 73 0a 2a 2a 20 63 72 65 61 74 65   files.** create
3580: 64 20 75 73 69 6e 67 20 41 54 54 41 43 48 20 73  d using ATTACH s
3590: 74 61 74 65 6d 65 6e 74 73 2e 20 20 52 65 74 75  tatements.  Retu
35a0: 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
35b0: 65 2e 20 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  e.  If an.** err
35c0: 6f 72 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65  or occurs, write
35d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
35e0: 65 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  e into *pzErrMsg
35f0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 61 20  ..**.** After a 
3600: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 69 74  database is init
3610: 69 61 6c 69 7a 65 64 2c 20 74 68 65 20 44 42 5f  ialized, the DB_
3620: 53 63 68 65 6d 61 4c 6f 61 64 65 64 20 62 69 74  SchemaLoaded bit
3630: 20 69 73 20 73 65 74 0a 2a 2a 20 62 69 74 20 69   is set.** bit i
3640: 73 20 73 65 74 20 69 6e 20 74 68 65 20 66 6c 61  s set in the fla
3650: 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
3660: 44 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66  Db structure. If
3670: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3680: 20 66 69 6c 65 20 77 61 73 20 6f 66 20 7a 65 72   file was of zer
3690: 6f 2d 6c 65 6e 67 74 68 2c 20 74 68 65 6e 20 74  o-length, then t
36a0: 68 65 20 44 42 5f 45 6d 70 74 79 20 66 6c 61 67  he DB_Empty flag
36b0: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 0a 2a 2f   is also set..*/
36c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 69 74  .int sqlite3Init
36d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68  (sqlite3 *db, ch
36e0: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a  ar **pzErrMsg){.
36f0: 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 69    int i, rc;.  i
3700: 6e 74 20 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e  nt commit_intern
3710: 61 6c 20 3d 20 21 28 64 62 2d 3e 6d 44 62 46 6c  al = !(db->mDbFl
3720: 61 67 73 26 44 42 46 4c 41 47 5f 53 63 68 65 6d  ags&DBFLAG_Schem
3730: 61 43 68 61 6e 67 65 29 3b 0a 20 20 0a 20 20 61  aChange);.  .  a
3740: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3750: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
3760: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
3770: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
3780: 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62  ldsMutex(db->aDb
3790: 5b 30 5d 2e 70 42 74 29 20 29 3b 0a 20 20 61 73  [0].pBt) );.  as
37a0: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
37b0: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 45 4e 43 28  usy==0 );.  ENC(
37c0: 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43  db) = SCHEMA_ENC
37d0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
37e0: 64 62 2d 3e 6e 44 62 3e 30 20 29 3b 0a 20 20 2f  db->nDb>0 );.  /
37f0: 2a 20 44 6f 20 74 68 65 20 6d 61 69 6e 20 73 63  * Do the main sc
3800: 68 65 6d 61 20 66 69 72 73 74 20 2a 2f 0a 20 20  hema first */.  
3810: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
3820: 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68  ty(db, 0, DB_Sch
3830: 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
3840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
3850: 69 74 4f 6e 65 28 64 62 2c 20 30 2c 20 70 7a 45  itOne(db, 0, pzE
3860: 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 69  rrMsg, 0);.    i
3870: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
3880: 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 6c 6c 20  c;.  }.  /* All 
3890: 6f 74 68 65 72 20 73 63 68 65 6d 61 73 20 61 66  other schemas af
38a0: 74 65 72 20 74 68 65 20 6d 61 69 6e 20 73 63 68  ter the main sch
38b0: 65 6d 61 2e 20 54 68 65 20 22 74 65 6d 70 22 20  ema. The "temp" 
38c0: 73 63 68 65 6d 61 20 6d 75 73 74 20 62 65 20 6c  schema must be l
38d0: 61 73 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 64  ast */.  for(i=d
38e0: 62 2d 3e 6e 44 62 2d 31 3b 20 69 3e 30 3b 20 69  b->nDb-1; i>0; i
38f0: 2d 2d 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  --){.    assert(
3900: 20 69 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33   i==1 || sqlite3
3910: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
3920: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
3930: 29 3b 0a 20 20 20 20 69 66 28 20 21 44 62 48 61  );.    if( !DbHa
3940: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  sProperty(db, i,
3950: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
3960: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
3970: 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 64  sqlite3InitOne(d
3980: 62 2c 20 69 2c 20 70 7a 45 72 72 4d 73 67 2c 20  b, i, pzErrMsg, 
3990: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
39a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
39b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f    }.  }.  if( co
39c0: 6d 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20 29 7b  mmit_internal ){
39d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d  .    sqlite3Comm
39e0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
39f0: 73 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  s(db);.  }.  ret
3a00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3a10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3a20: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
3a30: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
3a40: 73 63 68 65 6d 61 20 69 73 20 61 6c 72 65 61 64  schema is alread
3a50: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  y initialized..*
3a60: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
3a70: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3a80: 64 2e 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  d. An error code
3a90: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3aa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 61 64  .int sqlite3Read
3ab0: 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
3ac0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  arse){.  int rc 
3ad0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
3ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3af0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
3b00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3b10: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
3b20: 20 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   );.  if( !db->i
3b30: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
3b40: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
3b50: 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45  (db, &pParse->zE
3b60: 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
3b70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3b80: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
3b90: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50  c = rc;.      pP
3ba0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3bb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
3bc0: 6e 6f 53 68 61 72 65 64 43 61 63 68 65 20 29 7b  noSharedCache ){
3bd0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  .      db->mDbFl
3be0: 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
3bf0: 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 20  hemaKnownOk;.   
3c00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3c10: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  rc;.}.../*.** Ch
3c20: 65 63 6b 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  eck schema cooki
3c30: 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
3c40: 73 65 73 2e 20 20 49 66 20 61 6e 79 20 63 6f 6f  ses.  If any coo
3c50: 6b 69 65 20 69 73 20 6f 75 74 0a 2a 2a 20 6f 66  kie is out.** of
3c60: 20 64 61 74 65 20 73 65 74 20 70 50 61 72 73 65   date set pParse
3c70: 2d 3e 72 63 20 74 6f 20 53 51 4c 49 54 45 5f 53  ->rc to SQLITE_S
3c80: 43 48 45 4d 41 2e 20 20 49 66 20 61 6c 6c 20 73  CHEMA.  If all s
3c90: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 0a 2a 2a  chema cookies.**
3ca0: 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
3cb0: 20 74 6f 20 70 50 61 72 73 65 2d 3e 72 63 2e 0a   to pParse->rc..
3cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3cd0: 63 68 65 6d 61 49 73 56 61 6c 69 64 28 50 61 72  chemaIsValid(Par
3ce0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
3cf0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3d00: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
3d10: 44 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Db;.  int rc;.  
3d20: 69 6e 74 20 63 6f 6f 6b 69 65 3b 0a 0a 20 20 61  int cookie;..  a
3d30: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
3d40: 68 65 63 6b 53 63 68 65 6d 61 20 29 3b 0a 20 20  heckSchema );.  
3d50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
3d60: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
3d70: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
3d80: 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  Db=0; iDb<db->nD
3d90: 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 69  b; iDb++){.    i
3da0: 6e 74 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63  nt openedTransac
3db0: 74 69 6f 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  tion = 0;       
3dc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
3dd0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
3de0: 65 6e 65 64 20 2a 2f 0a 20 20 20 20 42 74 72 65  ened */.    Btre
3df0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
3e00: 5b 69 44 62 5d 2e 70 42 74 3b 20 20 20 20 20 2f  [iDb].pBt;     /
3e10: 2a 20 42 74 72 65 65 20 64 61 74 61 62 61 73 65  * Btree database
3e20: 20 74 6f 20 72 65 61 64 20 63 6f 6f 6b 69 65 20   to read cookie 
3e30: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 66 28 20  from */.    if( 
3e40: 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pBt==0 ) continu
3e50: 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
3e60: 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
3e70: 64 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  dy a read-only (
3e80: 6f 72 20 72 65 61 64 2d 77 72 69 74 65 29 20 74  or read-write) t
3e90: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
3ea0: 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  d.    ** on the 
3eb0: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
3ec0: 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49   open one now. I
3ed0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
3ee0: 69 73 20 6f 70 65 6e 65 64 2c 20 69 74 20 0a 20  is opened, it . 
3ef0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c     ** will be cl
3f00: 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  osed immediately
3f10: 20 61 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   after reading t
3f20: 68 65 20 6d 65 74 61 2d 76 61 6c 75 65 2e 20 2a  he meta-value. *
3f30: 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
3f40: 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54  e3BtreeIsInReadT
3f50: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
3f60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
3f70: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
3f80: 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
3f90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3fa0: 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c  NOMEM || rc==SQL
3fb0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
3fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3fd0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
3fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3ff0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4000: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
4010: 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f  openedTransactio
4020: 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 1;.    }..  
4030: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63    /* Read the sc
4040: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 72 6f 6d  hema cookie from
4050: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
4060: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  f it does not ma
4070: 74 63 68 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  tch the .    ** 
4080: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 73 20  value stored as 
4090: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
40a0: 65 6d 6f 72 79 20 73 63 68 65 6d 61 20 72 65 70  emory schema rep
40b0: 72 65 73 65 6e 74 61 74 69 6f 6e 2c 0a 20 20 20  resentation,.   
40c0: 20 2a 2a 20 73 65 74 20 50 61 72 73 65 2e 72 63   ** set Parse.rc
40d0: 20 74 6f 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   to SQLITE_SCHEM
40e0: 41 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  A. */.    sqlite
40f0: 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 42  3BtreeGetMeta(pB
4100: 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  t, BTREE_SCHEMA_
4110: 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29  VERSION, (u32 *)
4120: 26 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 61 73  &cookie);.    as
4130: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
4140: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
4150: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
4160: 69 66 28 20 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e  if( cookie!=db->
4170: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
4180: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ->schema_cookie 
4190: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
41a0: 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64  ResetOneSchema(d
41b0: 62 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 70  b, iDb);.      p
41c0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
41d0: 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 7d  TE_SCHEMA;.    }
41e0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74  ..    /* Close t
41f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
4200: 69 66 20 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65  if one was opene
4210: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70  d. */.    if( op
4220: 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20  enedTransaction 
4230: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4240: 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
4250: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4260: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73  *.** Convert a s
4270: 63 68 65 6d 61 20 70 6f 69 6e 74 65 72 20 69 6e  chema pointer in
4280: 74 6f 20 74 68 65 20 69 44 62 20 69 6e 64 65 78  to the iDb index
4290: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 0a   that indicates.
42a0: 2a 2a 20 77 68 69 63 68 20 64 61 74 61 62 61 73  ** which databas
42b0: 65 20 66 69 6c 65 20 69 6e 20 64 62 2d 3e 61 44  e file in db->aD
42c0: 62 5b 5d 20 74 68 65 20 73 63 68 65 6d 61 20 72  b[] the schema r
42d0: 65 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  efers to..**.** 
42e0: 49 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  If the same data
42f0: 62 61 73 65 20 69 73 20 61 74 74 61 63 68 65 64  base is attached
4300: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c   more than once,
4310: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 74   the first.** at
4320: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
4330: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
4340: 69 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65 6d  int sqlite3Schem
4350: 61 54 6f 49 6e 64 65 78 28 73 71 6c 69 74 65 33  aToIndex(sqlite3
4360: 20 2a 64 62 2c 20 53 63 68 65 6d 61 20 2a 70 53   *db, Schema *pS
4370: 63 68 65 6d 61 29 7b 0a 20 20 69 6e 74 20 69 20  chema){.  int i 
4380: 3d 20 2d 31 30 30 30 30 30 30 3b 0a 0a 20 20 2f  = -1000000;..  /
4390: 2a 20 49 66 20 70 53 63 68 65 6d 61 20 69 73 20  * If pSchema is 
43a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 74 75 72  NULL, then retur
43b0: 6e 20 2d 31 30 30 30 30 30 30 2e 20 54 68 69 73  n -1000000. This
43c0: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
43d0: 64 65 20 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72  de in .  ** expr
43e0: 2e 63 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20  .c is trying to 
43f0: 72 65 73 6f 6c 76 65 20 61 20 72 65 66 65 72 65  resolve a refere
4400: 6e 63 65 20 74 6f 20 61 20 74 72 61 6e 73 69 65  nce to a transie
4410: 6e 74 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f  nt table (i.e. o
4420: 6e 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  ne.  ** created 
4430: 62 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29  by a sub-select)
4440: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
4450: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
4460: 6f 66 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75  of this .  ** fu
4470: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65  nction should ne
4480: 76 65 72 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  ver be used..  *
4490: 2a 0a 20 20 2a 2a 20 57 65 20 72 65 74 75 72 6e  *.  ** We return
44a0: 20 2d 31 30 30 30 30 30 30 20 69 6e 73 74 65 61   -1000000 instea
44b0: 64 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 75 73  d of the more us
44c0: 75 61 6c 20 2d 31 20 73 69 6d 70 6c 79 20 62 65  ual -1 simply be
44d0: 63 61 75 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a  cause using.  **
44e0: 20 2d 31 30 30 30 30 30 30 20 61 73 20 74 68 65   -1000000 as the
44f0: 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 64 65 78   incorrect index
4500: 20 69 6e 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20   into db->aDb[] 
4510: 69 73 20 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f  is much .  ** mo
4520: 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75  re likely to cau
4530: 73 65 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  se a segfault th
4540: 61 6e 20 2d 31 20 28 6f 66 20 63 6f 75 72 73 65  an -1 (of course
4550: 20 74 68 65 72 65 20 61 72 65 20 61 73 73 65 72   there are asser
4560: 74 28 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  t().  ** stateme
4570: 6e 74 73 20 74 6f 6f 2c 20 62 75 74 20 69 74 20  nts too, but it 
4580: 6e 65 76 65 72 20 68 75 72 74 73 20 74 6f 20 70  never hurts to p
4590: 6c 61 79 20 74 68 65 20 6f 64 64 73 29 2e 0a 20  lay the odds).. 
45a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
45b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
45c0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
45d0: 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a   if( pSchema ){.
45e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 31 3b 20      for(i=0; 1; 
45f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
4600: 72 74 28 20 69 3c 64 62 2d 3e 6e 44 62 20 29 3b  rt( i<db->nDb );
4610: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
4620: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3d 3d 70  Db[i].pSchema==p
4630: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
4640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4650: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4660: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 64 62 2d  t( i>=0 && i<db-
4670: 3e 6e 44 62 20 29 3b 0a 20 20 7d 0a 20 20 72 65  >nDb );.  }.  re
4680: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 69 6e 74 20 73  turn i;.}..int s
4690: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
46a0: 64 65 78 32 28 73 71 6c 69 74 65 33 20 2a 64 62  dex2(sqlite3 *db
46b0: 2c 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d  , Schema *pSchem
46c0: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  a, const char *z
46d0: 44 62 29 7b 0a 20 20 69 66 28 20 7a 44 62 20 29  Db){.  if( zDb )
46e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
46f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4700: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
4710: 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74   if( i==1 ) cont
4720: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
4730: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
4740: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  Db, db->aDb[i].z
4750: 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  DbSName)==0 ) re
4760: 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
4770: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
4780: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
4790: 64 62 2c 20 70 53 63 68 65 6d 61 29 3b 0a 7d 0a  db, pSchema);.}.
47a0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
47b0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
47c0: 6e 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ns in the pParse
47d0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
47e0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 52 65 73  sqlite3ParserRes
47f0: 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
4800: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4810: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4820: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4830: 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  b, pParse->aLabe
4840: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
4850: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4860: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
4870: 70 72 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b  pr);.  if( db ){
4880: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4890: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
48a0: 62 6c 65 20 3e 3d 20 70 50 61 72 73 65 2d 3e 64  ble >= pParse->d
48b0: 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20  isableLookaside 
48c0: 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  );.    db->looka
48d0: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 2d 3d  side.bDisable -=
48e0: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
48f0: 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 7d 0a 20  Lookaside;.  }. 
4900: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
4910: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30 3b 0a 7d  Lookaside = 0;.}
4920: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ../*.** Compile 
4930: 74 68 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  the UTF-8 encode
4940: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  d SQL statement 
4950: 7a 53 71 6c 20 69 6e 74 6f 20 61 20 73 74 61 74  zSql into a stat
4960: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
4970: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4980: 74 65 33 50 72 65 70 61 72 65 28 0a 20 20 73 71  te3Prepare(.  sq
4990: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
49a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
49b0: 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20  ase handle. */. 
49c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
49d0: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54  l,         /* UT
49e0: 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20  F-8 encoded SQL 
49f0: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
4a00: 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20  int nBytes,     
4a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
4a20: 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62  gth of zSql in b
4a30: 79 74 65 73 2e 20 2a 2f 0a 20 20 75 33 32 20 70  ytes. */.  u32 p
4a40: 72 65 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20  repFlags,       
4a50: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
4a60: 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50  more SQLITE_PREP
4a70: 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20  ARE_* flags */. 
4a80: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
4a90: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d  e,         /* VM
4aa0: 20 62 65 69 6e 67 20 72 65 70 72 65 70 61 72 65   being reprepare
4ab0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  d */.  sqlite3_s
4ac0: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
4ad0: 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74   /* OUT: A point
4ae0: 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  er to the prepar
4af0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
4b00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
4b10: 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f  zTail       /* O
4b20: 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65  UT: End of parse
4b30: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
4b40: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
4b50: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 72   0;        /* Er
4b60: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
4b70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4b80: 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
4b90: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69  sult code */.  i
4ba0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
4bc0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 61   counter */.  Pa
4bd0: 72 73 65 20 73 50 61 72 73 65 3b 20 20 20 20 20  rse sParse;     
4be0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
4bf0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20  ng context */.. 
4c00: 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c   memset(&sParse,
4c10: 20 30 2c 20 50 41 52 53 45 5f 48 44 52 5f 53 5a   0, PARSE_HDR_SZ
4c20: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 50 41 52 53  );.  memset(PARS
4c30: 45 5f 54 41 49 4c 28 26 73 50 61 72 73 65 29 2c  E_TAIL(&sParse),
4c40: 20 30 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53   0, PARSE_TAIL_S
4c50: 5a 29 3b 0a 20 20 73 50 61 72 73 65 2e 70 52 65  Z);.  sParse.pRe
4c60: 70 72 65 70 61 72 65 20 3d 20 70 52 65 70 72 65  prepare = pRepre
4c70: 70 61 72 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pare;.  assert( 
4c80: 70 70 53 74 6d 74 20 26 26 20 2a 70 70 53 74 6d  ppStmt && *ppStm
4c90: 74 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 61 73 73  t==0 );.  /* ass
4ca0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
4cb0: 46 61 69 6c 65 64 20 29 3b 20 2f 2f 20 6e 6f 74  Failed ); // not
4cc0: 20 74 72 75 65 20 77 69 74 68 20 53 51 4c 49 54   true with SQLIT
4cd0: 45 5f 55 53 45 5f 41 4c 4c 4f 43 41 20 2a 2f 0a  E_USE_ALLOCA */.
4ce0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4cf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
4d00: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
4d10: 20 46 6f 72 20 61 20 6c 6f 6e 67 2d 74 65 72 6d   For a long-term
4d20: 20 75 73 65 20 70 72 65 70 61 72 65 64 20 73 74   use prepared st
4d30: 61 74 65 6d 65 6e 74 20 61 76 6f 69 64 20 74 68  atement avoid th
4d40: 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 6c 6f  e use of.  ** lo
4d50: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
4d60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 46    */.  if( prepF
4d70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 50 52  lags & SQLITE_PR
4d80: 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
4d90: 20 29 7b 0a 20 20 20 20 73 50 61 72 73 65 2e 64   ){.    sParse.d
4da0: 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 2b  isableLookaside+
4db0: 2b 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  +;.    db->looka
4dc0: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b  side.bDisable++;
4dd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
4de0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
4df0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
4e00: 6f 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  o get a read loc
4e10: 6b 20 6f 6e 20 61 6c 6c 0a 20 20 2a 2a 20 64 61  k on all.  ** da
4e20: 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 2e 20  tabase schemas. 
4e30: 20 54 68 65 20 69 6e 61 62 69 6c 69 74 79 20 74   The inability t
4e40: 6f 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  o get a read loc
4e50: 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  k indicates that
4e60: 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  .  ** some other
4e70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4e80: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
4e90: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 77 68  a write-lock, wh
4ea0: 69 63 68 20 69 6e 0a 20 20 2a 2a 20 74 75 72 6e  ich in.  ** turn
4eb0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
4ec0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
4ed0: 20 68 61 73 20 6d 61 64 65 20 75 6e 63 6f 6d 6d   has made uncomm
4ee0: 69 74 74 65 64 20 63 68 61 6e 67 65 73 0a 20 20  itted changes.  
4ef0: 2a 2a 20 74 6f 20 74 68 65 20 73 63 68 65 6d 61  ** to the schema
4f00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 72 65  ..  **.  ** Were
4f10: 20 77 65 20 74 6f 20 70 72 6f 63 65 65 64 20 61   we to proceed a
4f20: 6e 64 20 70 72 65 70 61 72 65 20 74 68 65 20 73  nd prepare the s
4f30: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74  tatement against
4f40: 20 74 68 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64   the uncommitted
4f50: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 63 68 61  .  ** schema cha
4f60: 6e 67 65 73 20 61 6e 64 20 69 66 20 74 68 6f 73  nges and if thos
4f70: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
4f80: 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c   are subsequentl
4f90: 79 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61  y rolled.  ** ba
4fa0: 63 6b 20 61 6e 64 20 64 69 66 66 65 72 65 6e 74  ck and different
4fb0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
4fc0: 65 20 69 6e 20 74 68 65 69 72 20 70 6c 61 63 65  e in their place
4fd0: 2c 20 74 68 65 6e 20 77 68 65 6e 20 74 68 69 73  , then when this
4fe0: 0a 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20 73  .  ** prepared s
4ff0: 74 61 74 65 6d 65 6e 74 20 67 6f 65 73 20 74 6f  tatement goes to
5000: 20 72 75 6e 20 74 68 65 20 73 63 68 65 6d 61 20   run the schema 
5010: 63 6f 6f 6b 69 65 20 77 6f 75 6c 64 20 66 61 69  cookie would fai
5020: 6c 20 74 6f 20 64 65 74 65 63 74 0a 20 20 2a 2a  l to detect.  **
5030: 20 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e   the schema chan
5040: 67 65 2e 20 20 44 69 73 61 73 74 65 72 20 77 6f  ge.  Disaster wo
5050: 75 6c 64 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2a  uld follow..  **
5060: 0a 20 20 2a 2a 20 54 68 69 73 20 74 68 72 65 61  .  ** This threa
5070: 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68  d is currently h
5080: 6f 6c 64 69 6e 67 20 6d 75 74 65 78 65 73 20 6f  olding mutexes o
5090: 6e 20 61 6c 6c 20 42 74 72 65 65 73 20 28 62 65  n all Btrees (be
50a0: 63 61 75 73 65 0a 20 20 2a 2a 20 6f 66 20 74 68  cause.  ** of th
50b0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  e sqlite3BtreeEn
50c0: 74 65 72 41 6c 6c 28 29 20 69 6e 20 73 71 6c 69  terAll() in sqli
50d0: 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72  te3LockAndPrepar
50e0: 65 28 29 29 20 73 6f 20 69 74 0a 20 20 2a 2a 20  e()) so it.  ** 
50f0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
5100: 66 6f 72 20 61 6e 6f 74 68 65 72 20 74 68 72 65  for another thre
5110: 61 64 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  ad to start a ne
5120: 77 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a  w schema change.
5130: 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
5140: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69  routine is runni
5150: 6e 67 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 64  ng.  Hence, we d
5160: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 68 6f  o not need to ho
5170: 6c 64 20 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 6f  ld .  ** locks o
5180: 6e 20 74 68 65 20 73 63 68 65 6d 61 2c 20 77 65  n the schema, we
5190: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 6d 61   just need to ma
51a0: 6b 65 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 65  ke sure nobody e
51b0: 6c 73 65 20 69 73 20 0a 20 20 2a 2a 20 68 6f 6c  lse is .  ** hol
51c0: 64 69 6e 67 20 74 68 65 6d 2e 0a 20 20 2a 2a 0a  ding them..  **.
51d0: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73    ** Note that s
51e0: 65 74 74 69 6e 67 20 52 45 41 44 5f 55 4e 43 4f  etting READ_UNCO
51f0: 4d 4d 49 54 54 45 44 20 6f 76 65 72 72 69 64 65  MMITTED override
5200: 73 20 6d 6f 73 74 20 6c 6f 63 6b 20 64 65 74 65  s most lock dete
5210: 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 62 75 74 20  ction,.  ** but 
5220: 69 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 6f 76  it does *not* ov
5230: 65 72 72 69 64 65 20 73 63 68 65 6d 61 20 6c 6f  erride schema lo
5240: 63 6b 20 64 65 74 65 63 74 69 6f 6e 2c 20 73 6f  ck detection, so
5250: 20 74 68 69 73 20 61 6c 6c 20 73 74 69 6c 6c 0a   this all still.
5260: 20 20 2a 2a 20 77 6f 72 6b 73 20 65 76 65 6e 20    ** works even 
5270: 69 66 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  if READ_UNCOMMIT
5280: 54 45 44 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  TED is set..  */
5290: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
52a0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 20 7b 0a 20 20  ->nDb; i++) {.  
52b0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
52c0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
52d0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
52e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
52f0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
5300: 65 78 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  ex(pBt) );.     
5310: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5320: 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 70  eeSchemaLocked(p
5330: 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
5340: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  c ){.        con
5350: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
5360: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
5370: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
5380: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
5390: 64 62 2c 20 72 63 2c 20 22 64 61 74 61 62 61 73  db, rc, "databas
53a0: 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b  e schema is lock
53b0: 65 64 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20  ed: %s", zDb);. 
53c0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
53d0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
53e0: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
53f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
5400: 20 65 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20 20   end_prepare;.  
5410: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5420: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
5430: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
5440: 20 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b   sParse.db = db;
5450: 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3e 3d 30  .  if( nBytes>=0
5460: 20 26 26 20 28 6e 42 79 74 65 73 3d 3d 30 20 7c   && (nBytes==0 |
5470: 7c 20 7a 53 71 6c 5b 6e 42 79 74 65 73 2d 31 5d  | zSql[nBytes-1]
5480: 21 3d 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72  !=0) ){.    char
5490: 20 2a 7a 53 71 6c 43 6f 70 79 3b 0a 20 20 20 20   *zSqlCopy;.    
54a0: 69 6e 74 20 6d 78 4c 65 6e 20 3d 20 64 62 2d 3e  int mxLen = db->
54b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
54c0: 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3b  MIT_SQL_LENGTH];
54d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
54e0: 42 79 74 65 73 3d 3d 6d 78 4c 65 6e 20 29 3b 0a  Bytes==mxLen );.
54f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 42      testcase( nB
5500: 79 74 65 73 3d 3d 6d 78 4c 65 6e 2b 31 20 29 3b  ytes==mxLen+1 );
5510: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 73 3e  .    if( nBytes>
5520: 6d 78 4c 65 6e 20 29 7b 0a 20 20 20 20 20 20 73  mxLen ){.      s
5530: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
5540: 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 4f  sg(db, SQLITE_TO
5550: 4f 42 49 47 2c 20 22 73 74 61 74 65 6d 65 6e 74  OBIG, "statement
5560: 20 74 6f 6f 20 6c 6f 6e 67 22 29 3b 0a 20 20 20   too long");.   
5570: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41     rc = sqlite3A
5580: 70 69 45 78 69 74 28 64 62 2c 20 53 51 4c 49 54  piExit(db, SQLIT
5590: 45 5f 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20  E_TOOBIG);.     
55a0: 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70 61 72   goto end_prepar
55b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  e;.    }.    zSq
55c0: 6c 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  lCopy = sqlite3D
55d0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 53 71  bStrNDup(db, zSq
55e0: 6c 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  l, nBytes);.    
55f0: 69 66 28 20 7a 53 71 6c 43 6f 70 79 20 29 7b 0a  if( zSqlCopy ){.
5600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 75 6e        sqlite3Run
5610: 50 61 72 73 65 72 28 26 73 50 61 72 73 65 2c 20  Parser(&sParse, 
5620: 7a 53 71 6c 43 6f 70 79 2c 20 26 7a 45 72 72 4d  zSqlCopy, &zErrM
5630: 73 67 29 3b 0a 20 20 20 20 20 20 73 50 61 72 73  sg);.      sPars
5640: 65 2e 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b  e.zTail = &zSql[
5650: 73 50 61 72 73 65 2e 7a 54 61 69 6c 2d 7a 53 71  sParse.zTail-zSq
5660: 6c 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 73 71  lCopy];.      sq
5670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5680: 7a 53 71 6c 43 6f 70 79 29 3b 0a 20 20 20 20 7d  zSqlCopy);.    }
5690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 50 61 72  else{.      sPar
56a0: 73 65 2e 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c  se.zTail = &zSql
56b0: 5b 6e 42 79 74 65 73 5d 3b 0a 20 20 20 20 7d 0a  [nBytes];.    }.
56c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
56d0: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 26 73  ite3RunParser(&s
56e0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
56f0: 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 61 73  rrMsg);.  }.  as
5700: 73 65 72 74 28 20 30 3d 3d 73 50 61 72 73 65 2e  sert( 0==sParse.
5710: 6e 51 75 65 72 79 4c 6f 6f 70 20 29 3b 0a 0a 20  nQueryLoop );.. 
5720: 20 69 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d   if( sParse.rc==
5730: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 73 50  SQLITE_DONE ) sP
5740: 61 72 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45  arse.rc = SQLITE
5750: 5f 4f 4b 3b 0a 20 20 69 66 28 20 73 50 61 72 73  _OK;.  if( sPars
5760: 65 2e 63 68 65 63 6b 53 63 68 65 6d 61 20 29 7b  e.checkSchema ){
5770: 0a 20 20 20 20 73 63 68 65 6d 61 49 73 56 61 6c  .    schemaIsVal
5780: 69 64 28 26 73 50 61 72 73 65 29 3b 0a 20 20 7d  id(&sParse);.  }
5790: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
57a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
57b0: 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c 49 54  Parse.rc = SQLIT
57c0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
57d0: 7d 0a 20 20 69 66 28 20 70 7a 54 61 69 6c 20 29  }.  if( pzTail )
57e0: 7b 0a 20 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20  {.    *pzTail = 
57f0: 73 50 61 72 73 65 2e 7a 54 61 69 6c 3b 0a 20 20  sParse.zTail;.  
5800: 7d 0a 20 20 72 63 20 3d 20 73 50 61 72 73 65 2e  }.  rc = sParse.
5810: 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
5820: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
5830: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5840: 45 5f 4f 4b 20 26 26 20 73 50 61 72 73 65 2e 70  E_OK && sParse.p
5850: 56 64 62 65 20 26 26 20 73 50 61 72 73 65 2e 65  Vdbe && sParse.e
5860: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 74  xplain ){.    st
5870: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5880: 2a 20 63 6f 6e 73 74 20 61 7a 43 6f 6c 4e 61 6d  * const azColNam
5890: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 22  e[] = {.       "
58a0: 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c  addr", "opcode",
58b0: 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33   "p1", "p2", "p3
58c0: 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22  ", "p4", "p5", "
58d0: 63 6f 6d 6d 65 6e 74 22 2c 0a 20 20 20 20 20 20  comment",.      
58e0: 20 22 69 64 22 2c 20 22 70 61 72 65 6e 74 22 2c   "id", "parent",
58f0: 20 22 6e 6f 74 75 73 65 64 22 2c 20 22 64 65 74   "notused", "det
5900: 61 69 6c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ail".    };.    
5910: 69 6e 74 20 69 46 69 72 73 74 2c 20 6d 78 3b 0a  int iFirst, mx;.
5920: 20 20 20 20 69 66 28 20 73 50 61 72 73 65 2e 65      if( sParse.e
5930: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
5940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5950: 74 4e 75 6d 43 6f 6c 73 28 73 50 61 72 73 65 2e  tNumCols(sParse.
5960: 70 56 64 62 65 2c 20 34 29 3b 0a 20 20 20 20 20  pVdbe, 4);.     
5970: 20 69 46 69 72 73 74 20 3d 20 38 3b 0a 20 20 20   iFirst = 8;.   
5980: 20 20 20 6d 78 20 3d 20 31 32 3b 0a 20 20 20 20     mx = 12;.    
5990: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
59a0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
59b0: 6c 73 28 73 50 61 72 73 65 2e 70 56 64 62 65 2c  ls(sParse.pVdbe,
59c0: 20 38 29 3b 0a 20 20 20 20 20 20 69 46 69 72 73   8);.      iFirs
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 78 20  t = 0;.      mx 
59e0: 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 8;.    }.    f
59f0: 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 6d  or(i=iFirst; i<m
5a00: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  x; i++){.      s
5a10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5a20: 4e 61 6d 65 28 73 50 61 72 73 65 2e 70 56 64 62  Name(sParse.pVdb
5a30: 65 2c 20 69 2d 69 46 69 72 73 74 2c 20 43 4f 4c  e, i-iFirst, COL
5a40: 4e 41 4d 45 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  NAME_NAME,.     
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 20 20 20 61 7a 43 6f 6c 4e 61 6d 65         azColName
5a70: 5b 69 5d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  [i], SQLITE_STAT
5a80: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  IC);.    }.  }.#
5a90: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64 62 2d  endif..  if( db-
5aa0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
5ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ac0: 53 65 74 53 71 6c 28 73 50 61 72 73 65 2e 70 56  SetSql(sParse.pV
5ad0: 64 62 65 2c 20 7a 53 71 6c 2c 20 28 69 6e 74 29  dbe, zSql, (int)
5ae0: 28 73 50 61 72 73 65 2e 7a 54 61 69 6c 2d 7a 53  (sParse.zTail-zS
5af0: 71 6c 29 2c 20 70 72 65 70 46 6c 61 67 73 29 3b  ql), prepFlags);
5b00: 0a 20 20 7d 0a 20 20 69 66 28 20 73 50 61 72 73  .  }.  if( sPars
5b10: 65 2e 70 56 64 62 65 20 26 26 20 28 72 63 21 3d  e.pVdbe && (rc!=
5b20: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d  SQLITE_OK || db-
5b30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
5b40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
5b50: 65 46 69 6e 61 6c 69 7a 65 28 73 50 61 72 73 65  eFinalize(sParse
5b60: 2e 70 56 64 62 65 29 3b 0a 20 20 20 20 61 73 73  .pVdbe);.    ass
5b70: 65 72 74 28 21 28 2a 70 70 53 74 6d 74 29 29 3b  ert(!(*ppStmt));
5b80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
5b90: 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
5ba0: 5f 73 74 6d 74 2a 29 73 50 61 72 73 65 2e 70 56  _stmt*)sParse.pV
5bb0: 64 62 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dbe;.  }..  if( 
5bc0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73  zErrMsg ){.    s
5bd0: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
5be0: 73 67 28 64 62 2c 20 72 63 2c 20 22 25 73 22 2c  sg(db, rc, "%s",
5bf0: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
5c00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5c10: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 65 6c   zErrMsg);.  }el
5c20: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
5c30: 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
5c40: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
5c50: 6e 79 20 54 72 69 67 67 65 72 50 72 67 20 73 74  ny TriggerPrg st
5c60: 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
5c70: 65 64 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67  ed while parsing
5c80: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e   this statement.
5c90: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 50 61   */.  while( sPa
5ca0: 72 73 65 2e 70 54 72 69 67 67 65 72 50 72 67 20  rse.pTriggerPrg 
5cb0: 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 50 72  ){.    TriggerPr
5cc0: 67 20 2a 70 54 20 3d 20 73 50 61 72 73 65 2e 70  g *pT = sParse.p
5cd0: 54 72 69 67 67 65 72 50 72 67 3b 0a 20 20 20 20  TriggerPrg;.    
5ce0: 73 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50  sParse.pTriggerP
5cf0: 72 67 20 3d 20 70 54 2d 3e 70 4e 65 78 74 3b 0a  rg = pT->pNext;.
5d00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5d10: 65 28 64 62 2c 20 70 54 29 3b 0a 20 20 7d 0a 0a  e(db, pT);.  }..
5d20: 65 6e 64 5f 70 72 65 70 61 72 65 3a 0a 0a 20 20  end_prepare:..  
5d30: 73 71 6c 69 74 65 33 50 61 72 73 65 72 52 65 73  sqlite3ParserRes
5d40: 65 74 28 26 73 50 61 72 73 65 29 3b 0a 20 20 72  et(&sParse);.  r
5d50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
5d60: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4c 6f  ic int sqlite3Lo
5d70: 63 6b 41 6e 64 50 72 65 70 61 72 65 28 0a 20 20  ckAndPrepare(.  
5d80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5da0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f  abase handle. */
5db0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5dc0: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql,         /* 
5dd0: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51  UTF-8 encoded SQ
5de0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  L statement. */.
5df0: 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20    int nBytes,   
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5e10: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
5e20: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 33 32   bytes. */.  u32
5e30: 20 70 72 65 70 46 6c 61 67 73 2c 20 20 20 20 20   prepFlags,     
5e40: 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
5e50: 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50 52  r more SQLITE_PR
5e60: 45 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  EPARE_* flags */
5e70: 0a 20 20 56 64 62 65 20 2a 70 4f 6c 64 2c 20 20  .  Vdbe *pOld,  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e90: 56 4d 20 62 65 69 6e 67 20 72 65 70 72 65 70 61  VM being reprepa
5ea0: 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
5eb0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
5ec0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
5ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
5ee0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
5ef0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5f00: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
5f10: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
5f20: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
5f30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
5f40: 20 63 6e 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65   cnt = 0;..#ifde
5f50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5f60: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
5f70: 70 70 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75  ppStmt==0 ) retu
5f80: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
5f90: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
5fa0: 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
5fb0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
5fc0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 7c 7c 7a 53  yCheckOk(db)||zS
5fd0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ql==0 ){.    ret
5fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
5ff0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
6000: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6010: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6020: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6030: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 64 6f 7b 0a  rAll(db);.  do{.
6040: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 6d 75 6c 74      /* Make mult
6050: 69 70 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f  iple attempts to
6060: 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c   compile the SQL
6070: 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65  , until it eithe
6080: 72 20 73 75 63 63 65 65 64 73 0a 20 20 20 20 2a  r succeeds.    *
6090: 2a 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72 73 20  * or encounters 
60a0: 61 20 70 65 72 6d 61 6e 65 6e 74 20 65 72 72 6f  a permanent erro
60b0: 72 2e 20 20 41 20 73 63 68 65 6d 61 20 70 72 6f  r.  A schema pro
60c0: 62 6c 65 6d 20 61 66 74 65 72 20 6f 6e 65 20 73  blem after one s
60d0: 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20 72 65 73  chema.    ** res
60e0: 65 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  et is considered
60f0: 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 65 72 72   a permanent err
6100: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  or. */.    rc = 
6110: 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 28 64  sqlite3Prepare(d
6120: 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c  b, zSql, nBytes,
6130: 20 70 72 65 70 46 6c 61 67 73 2c 20 70 4f 6c 64   prepFlags, pOld
6140: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c  , ppStmt, pzTail
6150: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
6160: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
6170: 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  *ppStmt==0 );.  
6180: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
6190: 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 0a 20  TE_ERROR_RETRY. 
61a0: 20 20 20 20 20 20 7c 7c 20 28 72 63 3d 3d 53 51        || (rc==SQ
61b0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 26 26 20 28  LITE_SCHEMA && (
61c0: 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53  sqlite3ResetOneS
61d0: 63 68 65 6d 61 28 64 62 2c 2d 31 29 2c 20 63 6e  chema(db,-1), cn
61e0: 74 2b 2b 29 3d 3d 30 29 20 29 3b 0a 20 20 73 71  t++)==0) );.  sq
61f0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
6200: 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
6210: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
6220: 2c 20 72 63 29 3b 0a 20 20 61 73 73 65 72 74 28  , rc);.  assert(
6230: 20 28 72 63 26 64 62 2d 3e 65 72 72 4d 61 73 6b   (rc&db->errMask
6240: 29 3d 3d 72 63 20 29 3b 0a 20 20 73 71 6c 69 74  )==rc );.  sqlit
6250: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6260: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6270: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
6280: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6290: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
62a0: 43 68 65 63 6b 73 20 69 66 20 74 68 65 20 73 70  Checks if the sp
62b0: 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 69 73  ecified token is
62c0: 20 61 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e   a table, column
62d0: 2c 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  , or function na
62e0: 6d 65 2c 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  me,.** based on 
62f0: 74 68 65 20 64 61 74 61 62 61 73 65 73 20 61 73  the databases as
6300: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
6310: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
6320: 67 20 70 72 65 70 61 72 65 64 2e 0a 2a 2a 20 49  g prepared..** I
6330: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 66  f the function f
6340: 61 69 6c 73 2c 20 7a 65 72 6f 20 69 73 20 72 65  ails, zero is re
6350: 74 75 72 6e 65 64 20 61 6e 64 20 70 52 63 20 69  turned and pRc i
6360: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
6370: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e  e.** error code.
6380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6390: 68 6f 75 6c 64 54 72 65 61 74 41 73 49 64 65 6e  houldTreatAsIden
63a0: 74 69 66 69 65 72 28 0a 20 20 73 71 6c 69 74 65  tifier(.  sqlite
63b0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
63c0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
63d0: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
63e0: 72 20 2a 7a 54 6f 6b 65 6e 2c 20 2f 2a 20 50 6f  r *zToken, /* Po
63f0: 69 6e 74 65 72 20 74 6f 20 73 74 61 72 74 20 6f  inter to start o
6400: 66 20 74 6f 6b 65 6e 20 74 6f 20 62 65 20 63 68  f token to be ch
6410: 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecked */.  int n
6420: 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 2f  Token,         /
6430: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 6f 6b 65  * Length of toke
6440: 6e 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20  n to be checked 
6450: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
6460: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
6470: 74 65 72 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ter to error cod
6480: 65 20 75 70 6f 6e 20 66 61 69 6c 75 72 65 20 2a  e upon failure *
6490: 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 46 6f 75 6e  /.){.  int bFoun
64a0: 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f  d = 0;     /* No
64b0: 6e 2d 7a 65 72 6f 20 69 66 20 74 6f 6b 65 6e 20  n-zero if token 
64c0: 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  is an identifier
64d0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 69 6e 74 20   name. */.  int 
64e0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
64f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 61 6e 64 20  /* Database and 
6500: 63 6f 6c 75 6d 6e 20 6c 6f 6f 70 20 69 6e 64 65  column loop inde
6510: 78 65 73 2e 20 2a 2f 0a 20 20 53 63 68 65 6d 61  xes. */.  Schema
6520: 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a   *pSchema;    /*
6530: 20 53 63 68 65 6d 61 20 66 6f 72 20 63 75 72 72   Schema for curr
6540: 65 6e 74 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  ent database. */
6550: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 20  .  Hash *pHash; 
6560: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
6570: 61 62 6c 65 20 6f 66 20 74 61 62 6c 65 73 20 66  able of tables f
6580: 6f 72 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  or current datab
6590: 61 73 65 2e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  ase. */.  HashEl
65a0: 65 6d 20 2a 65 3b 20 20 20 20 20 20 20 20 2f 2a  em *e;        /*
65b0: 20 48 61 73 68 20 65 6c 65 6d 65 6e 74 20 66 6f   Hash element fo
65c0: 72 20 68 61 73 68 20 74 61 62 6c 65 20 69 74 65  r hash table ite
65d0: 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 54 61 62  ration. */.  Tab
65e0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
65f0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 61 62   /* Database tab
6600: 6c 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 62  le for columns b
6610: 65 69 6e 67 20 63 68 65 63 6b 65 64 2e 20 2a 2f  eing checked. */
6620: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ..  if( sqlite3I
6630: 73 52 6f 77 69 64 4e 28 7a 54 6f 6b 65 6e 2c 20  sRowidN(zToken, 
6640: 6e 54 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 72  nToken) ){.    r
6650: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
6660: 66 28 20 6e 54 6f 6b 65 6e 3e 30 20 29 7b 0a 20  f( nToken>0 ){. 
6670: 20 20 20 69 6e 74 20 68 61 73 68 20 3d 20 53 51     int hash = SQ
6680: 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 28 73  LITE_FUNC_HASH(s
6690: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
66a0: 65 72 5b 28 75 38 29 7a 54 6f 6b 65 6e 5b 30 5d  er[(u8)zToken[0]
66b0: 5d 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  ], nToken);.    
66c0: 69 66 28 20 73 71 6c 69 74 65 33 46 75 6e 63 74  if( sqlite3Funct
66d0: 69 6f 6e 53 65 61 72 63 68 4e 28 68 61 73 68 2c  ionSearchN(hash,
66e0: 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   zToken, nToken)
66f0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
6700: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6710: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
6720: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6730: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6740: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
6760: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6770: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
6780: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 73 71  Func;.    if( sq
6790: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 4e 28 70  lite3HashFindN(p
67a0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
67b0: 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 62  oken) ){.      b
67c0: 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20  Found = 1;.     
67d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
67e0: 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e    pSchema = db->
67f0: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
6800: 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61 3d      if( pSchema=
6810: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
6820: 20 20 20 70 48 61 73 68 20 3d 20 26 70 53 63 68     pHash = &pSch
6830: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
6840: 20 20 69 66 28 20 73 71 6c 69 74 65 33 48 61 73    if( sqlite3Has
6850: 68 46 69 6e 64 4e 28 70 48 61 73 68 2c 20 7a 54  hFindN(pHash, zT
6860: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 7b  oken, nToken) ){
6870: 0a 20 20 20 20 20 20 62 46 6f 75 6e 64 20 3d 20  .      bFound = 
6880: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
6890: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 65 3d      }.    for(e=
68a0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
68b0: 70 48 61 73 68 29 3b 20 65 3b 20 65 3d 73 71 6c  pHash); e; e=sql
68c0: 69 74 65 48 61 73 68 4e 65 78 74 28 65 29 29 7b  iteHashNext(e)){
68d0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
68e0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 65 29 3b  liteHashData(e);
68f0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6900: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
6910: 20 20 20 20 20 70 48 61 73 68 20 3d 20 70 54 61       pHash = pTa
6920: 62 2d 3e 70 43 6f 6c 48 61 73 68 3b 0a 20 20 20  b->pColHash;.   
6930: 20 20 20 69 66 28 20 70 48 61 73 68 3d 3d 30 20     if( pHash==0 
6940: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
6950: 3e 70 43 6f 6c 48 61 73 68 20 3d 20 70 48 61 73  >pColHash = pHas
6960: 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  h = sqlite3_mall
6970: 6f 63 28 73 69 7a 65 6f 66 28 48 61 73 68 29 29  oc(sizeof(Hash))
6980: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
6990: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ash ){.         
69a0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
69b0: 28 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 20  (pHash);.       
69c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
69d0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 75              Colu
69f0: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62  mn *pCol = &pTab
6a00: 2d 3e 61 43 6f 6c 5b 6a 5d 3b 0a 20 20 20 20 20  ->aCol[j];.     
6a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
6a20: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
6a30: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  pCol->zName, pCo
6a40: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
6a50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6a60: 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20           *pRc = 
6a70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
6a80: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f  T;.          bFo
6a90: 75 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  und = 0;.       
6aa0: 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20     goto done;.  
6ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6ac0: 20 20 20 20 20 20 69 66 28 20 70 48 61 73 68 20        if( pHash 
6ad0: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
6ae0: 6e 64 4e 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65  ndN(pHash, zToke
6af0: 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 7b 0a 20 20  n, nToken) ){.  
6b00: 20 20 20 20 20 20 62 46 6f 75 6e 64 20 3d 20 31        bFound = 1
6b10: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  ;.        goto d
6b20: 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  one;.      }.   
6b30: 20 7d 0a 20 20 7d 0a 64 6f 6e 65 3a 0a 20 20 73   }.  }.done:.  s
6b40: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6b50: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6b60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6b70: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6b80: 75 72 6e 20 62 46 6f 75 6e 64 3b 0a 7d 0a 0a 2f  urn bFound;.}../
6b90: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
6ba0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 66 69 6e  estimate the fin
6bb0: 61 6c 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  al output buffer
6bc0: 20 73 69 7a 65 20 6e 65 65 64 65 64 20 66 6f 72   size needed for
6bd0: 20 74 68 65 20 66 75 6c 6c 79 0a 2a 2a 20 6e 6f   the fully.** no
6be0: 72 6d 61 6c 69 7a 65 64 20 76 65 72 73 69 6f 6e  rmalized version
6bf0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
6c00: 64 20 53 51 4c 20 73 74 72 69 6e 67 2e 20 20 54  d SQL string.  T
6c10: 68 69 73 20 73 68 6f 75 6c 64 20 74 61 6b 65 20  his should take 
6c20: 69 6e 74 6f 0a 2a 2a 20 61 63 63 6f 75 6e 74 20  into.** account 
6c30: 61 6e 79 20 70 6f 74 65 6e 74 69 61 6c 20 65 78  any potential ex
6c40: 70 61 6e 73 69 6f 6e 20 74 68 61 74 20 63 6f 75  pansion that cou
6c50: 6c 64 20 6f 63 63 75 72 20 28 65 2e 67 2e 20 76  ld occur (e.g. v
6c60: 69 61 20 49 4e 20 63 6c 61 75 73 65 73 0a 2a 2a  ia IN clauses.**
6c70: 20 62 65 69 6e 67 20 65 78 70 61 6e 64 65 64 2c   being expanded,
6c80: 20 65 74 63 29 2e 20 20 54 68 69 73 20 73 69 7a   etc).  This siz
6c90: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
6ca0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
6cb0: 66 20 62 79 74 65 73 0a 2a 2a 20 69 6e 63 6c 75  f bytes.** inclu
6cc0: 64 69 6e 67 20 74 68 65 20 4e 55 4c 20 74 65 72  ding the NUL ter
6cd0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
6ce0: 69 63 20 69 6e 74 20 65 73 74 69 6d 61 74 65 4e  ic int estimateN
6cf0: 6f 72 6d 61 6c 69 7a 65 64 53 69 7a 65 28 0a 20  ormalizedSize(. 
6d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
6d10: 6c 2c 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e  l, /* The origin
6d20: 61 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  al SQL string */
6d30: 0a 20 20 69 6e 74 20 6e 53 71 6c 2c 20 20 20 20  .  int nSql,    
6d40: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
6d50: 66 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  f original SQL s
6d60: 74 72 69 6e 67 20 2a 2f 0a 20 20 75 38 20 70 72  tring */.  u8 pr
6d70: 65 70 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  epFlags      /* 
6d80: 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
6d90: 20 74 6f 20 73 71 6c 69 74 65 33 5f 70 72 65 70   to sqlite3_prep
6da0: 61 72 65 5f 76 33 28 29 20 2a 2f 0a 29 7b 0a 20  are_v3() */.){. 
6db0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 6e 53 71 6c   int nOut = nSql
6dc0: 20 2b 20 34 3b 0a 20 20 63 6f 6e 73 74 20 63 68   + 4;.  const ch
6dd0: 61 72 20 2a 7a 20 3d 20 7a 53 71 6c 3b 0a 20 20  ar *z = zSql;.  
6de0: 77 68 69 6c 65 28 20 6e 4f 75 74 3c 6e 53 71 6c  while( nOut<nSql
6df0: 2a 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  *5 ){.    while(
6e00: 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a 5b 30 5d   z[0]!=0 && z[0]
6e10: 21 3d 27 49 27 20 26 26 20 7a 5b 30 5d 21 3d 27  !='I' && z[0]!='
6e20: 69 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  i' ){ z++; }.   
6e30: 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 62   if( z[0]==0 ) b
6e40: 72 65 61 6b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  reak;.    z++;. 
6e50: 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 4e 27     if( z[0]!='N'
6e60: 20 26 26 20 7a 5b 30 5d 21 3d 27 6e 27 20 29 20   && z[0]!='n' ) 
6e70: 62 72 65 61 6b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a  break;.    z++;.
6e80: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
6e90: 65 33 49 73 73 70 61 63 65 28 7a 5b 30 5d 29 20  e3Isspace(z[0]) 
6ea0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
6eb0: 28 20 7a 5b 30 5d 21 3d 27 28 27 20 29 20 62 72  ( z[0]!='(' ) br
6ec0: 65 61 6b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  eak;.    z++;.  
6ed0: 20 20 6e 4f 75 74 20 2b 3d 20 35 3b 20 2f 2a 20    nOut += 5; /* 
6ee0: 3f 2c 3f 2c 3f 20 2a 2f 0a 20 20 7d 0a 20 20 72  ?,?,? */.  }.  r
6ef0: 65 74 75 72 6e 20 6e 4f 75 74 3b 0a 7d 0a 0a 2f  eturn nOut;.}../
6f00: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 75  *.** Copy the cu
6f10: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 69 6e 74 6f  rrent token into
6f20: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
6f30: 65 72 20 77 68 69 6c 65 20 64 65 61 6c 69 6e 67  er while dealing
6f40: 20 77 69 74 68 20 71 75 6f 74 65 64 0a 2a 2a 20   with quoted.** 
6f50: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 42 79  identifiers.  By
6f60: 20 64 65 66 61 75 6c 74 2c 20 61 6c 6c 20 6c 65   default, all le
6f70: 74 74 65 72 73 20 77 69 6c 6c 20 62 65 20 63 6f  tters will be co
6f80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 6c 6f 77  nverted into low
6f90: 65 72 63 61 73 65 2e 0a 2a 2a 20 49 66 20 74 68  ercase..** If th
6fa0: 65 20 62 55 70 70 65 72 20 66 6c 61 67 20 69 73  e bUpper flag is
6fb0: 20 73 65 74 2c 20 75 70 70 65 72 63 61 73 65 20   set, uppercase 
6fc0: 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54  will be used.  T
6fd0: 68 65 20 70 69 4f 75 74 20 61 72 67 75 6d 65 6e  he piOut argumen
6fe0: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65  t.** will be use
6ff0: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
7000: 74 61 72 67 65 74 20 69 6e 64 65 78 20 69 6e 74  target index int
7010: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 74 72  o the output str
7020: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
7030: 6f 69 64 20 63 6f 70 79 4e 6f 72 6d 61 6c 69 7a  oid copyNormaliz
7040: 65 64 54 6f 6b 65 6e 28 0a 20 20 63 6f 6e 73 74  edToken(.  const
7050: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a 20   char *zSql, /* 
7060: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  The original SQL
7070: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
7080: 20 69 49 6e 2c 20 20 20 20 20 20 20 20 20 20 2f   iIn,          /
7090: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
70a0: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
70b0: 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  l SQL string */.
70c0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
70d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
70e0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 75   bytes in the cu
70f0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
7100: 20 69 6e 74 20 74 6f 6b 65 6e 46 6c 61 67 73 2c   int tokenFlags,
7110: 20 20 20 2f 2a 20 46 6c 61 67 73 20 72 65 74 75     /* Flags retu
7120: 72 6e 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65  rned by the toke
7130: 6e 69 7a 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  nizer */.  char 
7140: 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20 2f 2a 20  *zOut,       /* 
7150: 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e  The output strin
7160: 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 4f 75  g */.  int *piOu
7170: 74 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  t        /* Poin
7180: 74 65 72 20 74 6f 20 74 61 72 67 65 74 20 69 6e  ter to target in
7190: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  dex into the out
71a0: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  put string */.){
71b0: 0a 20 20 69 6e 74 20 62 51 75 6f 74 65 64 20 3d  .  int bQuoted =
71c0: 20 74 6f 6b 65 6e 46 6c 61 67 73 20 26 20 53 51   tokenFlags & SQ
71d0: 4c 49 54 45 5f 54 4f 4b 45 4e 5f 51 55 4f 54 45  LITE_TOKEN_QUOTE
71e0: 44 3b 0a 20 20 69 6e 74 20 62 4b 65 79 77 6f 72  D;.  int bKeywor
71f0: 64 20 3d 20 74 6f 6b 65 6e 46 6c 61 67 73 20 26  d = tokenFlags &
7200: 20 53 51 4c 49 54 45 5f 54 4f 4b 45 4e 5f 4b 45   SQLITE_TOKEN_KE
7210: 59 57 4f 52 44 3b 0a 20 20 69 6e 74 20 6a 20 3d  YWORD;.  int j =
7220: 20 2a 70 69 4f 75 74 2c 20 6b 20 3d 20 30 3b 0a   *piOut, k = 0;.
7230: 20 20 66 6f 72 28 3b 20 6b 3c 6e 54 6f 6b 65 6e    for(; k<nToken
7240: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; k++){.    if( 
7250: 62 51 75 6f 74 65 64 20 29 7b 0a 20 20 20 20 20  bQuoted ){.     
7260: 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 69 49 6e   if( k==0 && iIn
7270: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4f  >0 ){.        zO
7280: 75 74 5b 6a 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20  ut[j++] = '"';. 
7290: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
72a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
72b0: 20 6b 3d 3d 6e 54 6f 6b 65 6e 2d 31 20 29 7b 0a   k==nToken-1 ){.
72c0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
72d0: 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ] = '"';.       
72e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
72f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7300: 20 62 4b 65 79 77 6f 72 64 20 29 7b 0a 20 20 20   bKeyword ){.   
7310: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 73     zOut[j++] = s
7320: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 53  qlite3Toupper(zS
7330: 71 6c 5b 69 49 6e 2b 6b 5d 29 3b 0a 20 20 20 20  ql[iIn+k]);.    
7340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4f 75  }else{.      zOu
7350: 74 5b 6a 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  t[j++] = sqlite3
7360: 54 6f 6c 6f 77 65 72 28 7a 53 71 6c 5b 69 49 6e  Tolower(zSql[iIn
7370: 2b 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  +k]);.    }.  }.
7380: 20 20 2a 70 69 4f 75 74 20 3d 20 6a 3b 0a 7d 0a    *piOut = j;.}.
7390: 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 6e  ./*.** Perform n
73a0: 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  ormalization of 
73b0: 74 68 65 20 53 51 4c 20 63 6f 6e 74 61 69 6e 65  the SQL containe
73c0: 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
73d0: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a  d statement and.
73e0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
73f0: 75 6c 74 20 69 6e 20 74 68 65 20 7a 4e 6f 72 6d  ult in the zNorm
7400: 53 71 6c 20 66 69 65 6c 64 2e 20 20 54 68 65 20  Sql field.  The 
7410: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 61  schema for the a
7420: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 64 61 74  ssociated.** dat
7430: 61 62 61 73 65 73 20 61 72 65 20 63 6f 6e 73 75  abases are consu
7440: 6c 74 65 64 20 77 68 69 6c 65 20 70 65 72 66 6f  lted while perfo
7450: 72 6d 69 6e 67 20 74 68 65 20 6e 6f 72 6d 61 6c  rming the normal
7460: 69 7a 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72  ization in order
7470: 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65   to.** determine
7480: 20 69 66 20 61 20 74 6f 6b 65 6e 20 61 70 70 65   if a token appe
7490: 61 72 73 20 74 6f 20 62 65 20 61 6e 20 69 64 65  ars to be an ide
74a0: 6e 74 69 66 69 65 72 2e 20 20 41 6c 6c 20 69 64  ntifier.  All id
74b0: 65 6e 74 69 66 69 65 72 73 20 61 72 65 0a 2a 2a  entifiers are.**
74c0: 20 6c 65 66 74 20 69 6e 74 61 63 74 20 69 6e 20   left intact in 
74d0: 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 53  the normalized S
74e0: 51 4c 20 61 6e 64 20 61 6c 6c 20 6c 69 74 65 72  QL and all liter
74f0: 61 6c 73 20 61 72 65 20 72 65 70 6c 61 63 65 64  als are replaced
7500: 20 77 69 74 68 20 61 0a 2a 2a 20 73 69 6e 67 6c   with a.** singl
7510: 65 20 27 3f 27 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e '?'..*/.void s
7520: 71 6c 69 74 65 33 4e 6f 72 6d 61 6c 69 7a 65 28  qlite3Normalize(
7530: 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 2c 20  .  Vdbe *pVdbe, 
7540: 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
7550: 20 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a 20   reprepared */. 
7560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
7570: 6c 2c 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e  l, /* The origin
7580: 61 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  al SQL string */
7590: 0a 20 20 69 6e 74 20 6e 53 71 6c 2c 20 20 20 20  .  int nSql,    
75a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
75b0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
75c0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
75d0: 38 20 70 72 65 70 46 6c 61 67 73 20 20 20 20 20  8 prepFlags     
75e0: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61   /* The flags pa
75f0: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f  ssed to sqlite3_
7600: 70 72 65 70 61 72 65 5f 76 33 28 29 20 2a 2f 0a  prepare_v3() */.
7610: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7620: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
7630: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
7640: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
7650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7660: 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  he output string
7670: 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 3b 20 20 20   */.  int nZ;   
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7690: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  Size of the outp
76a0: 75 74 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74  ut string in byt
76b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76d0: 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72  * Next character
76e0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 7a 53   to read from zS
76f0: 71 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ql[] */.  int j;
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
7720: 65 72 20 74 6f 20 66 69 6c 6c 20 69 6e 20 6f 6e  er to fill in on
7730: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 74 6f   z[] */.  int to
7740: 6b 65 6e 54 79 70 65 20 3d 20 30 3b 20 20 20 20  kenType = 0;    
7750: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
7760: 6e 65 78 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  next token */.  
7770: 69 6e 74 20 70 72 65 76 54 6f 6b 65 6e 54 79 70  int prevTokenTyp
7780: 65 20 3d 20 30 3b 20 2f 2a 20 54 79 70 65 20 6f  e = 0; /* Type o
7790: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  f the previous t
77a0: 6f 6b 65 6e 2c 20 65 78 63 65 70 74 20 73 70 61  oken, except spa
77b0: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ces */.  int n; 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6e  /* Size of the n
77e0: 65 78 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ext token */.  i
77f0: 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 20 20  nt nParen = 0;  
7800: 20 20 20 20 20 20 2f 2a 20 4e 65 73 74 69 6e 67        /* Nesting
7810: 20 6c 65 76 65 6c 20 6f 66 20 70 61 72 65 6e 74   level of parent
7820: 68 65 73 69 73 20 2a 2f 0a 20 20 48 61 73 68 20  hesis */.  Hash 
7830: 69 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20  inHash;         
7840: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66 20 70 61    /* Table of pa
7850: 72 65 6e 74 68 65 73 69 73 20 6c 65 76 65 6c 73  renthesis levels
7860: 20 74 6f 20 6f 75 74 70 75 74 20 69 6e 64 65 78   to output index
7870: 2e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 73 71 6c  . */..  db = sql
7880: 69 74 65 33 56 64 62 65 44 62 28 70 56 64 62 65  ite3VdbeDb(pVdbe
7890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  );.  assert( db!
78a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
78b0: 70 56 64 62 65 2d 3e 7a 4e 6f 72 6d 53 71 6c 3d  pVdbe->zNormSql=
78c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  =0 );.  if( zSql
78d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
78e0: 6e 5a 20 3d 20 65 73 74 69 6d 61 74 65 4e 6f 72  nZ = estimateNor
78f0: 6d 61 6c 69 7a 65 64 53 69 7a 65 28 7a 53 71 6c  malizedSize(zSql
7900: 2c 20 6e 53 71 6c 2c 20 70 72 65 70 46 6c 61 67  , nSql, prepFlag
7910: 73 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  s);.  z = sqlite
7920: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
7930: 62 2c 20 6e 5a 29 3b 0a 20 20 69 66 28 20 7a 3d  b, nZ);.  if( z=
7940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
7950: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
7960: 69 6e 48 61 73 68 29 3b 0a 20 20 66 6f 72 28 69  inHash);.  for(i
7970: 3d 6a 3d 30 3b 20 69 3c 6e 53 71 6c 20 26 26 20  =j=0; i<nSql && 
7980: 7a 53 71 6c 5b 69 5d 3b 20 69 2b 3d 6e 29 7b 0a  zSql[i]; i+=n){.
7990: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
79a0: 30 3b 0a 20 20 20 20 69 66 28 20 74 6f 6b 65 6e  0;.    if( token
79b0: 54 79 70 65 21 3d 54 4b 5f 53 50 41 43 45 20 29  Type!=TK_SPACE )
79c0: 20 70 72 65 76 54 6f 6b 65 6e 54 79 70 65 20 3d   prevTokenType =
79d0: 20 74 6f 6b 65 6e 54 79 70 65 3b 0a 20 20 20 20   tokenType;.    
79e0: 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 6f  n = sqlite3GetTo
79f0: 6b 65 6e 4e 6f 72 6d 61 6c 69 7a 65 64 28 28 75  kenNormalized((u
7a00: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
7a10: 71 6c 2b 69 2c 20 26 74 6f 6b 65 6e 54 79 70 65  ql+i, &tokenType
7a20: 2c 20 26 66 6c 61 67 73 29 3b 0a 20 20 20 20 73  , &flags);.    s
7a30: 77 69 74 63 68 28 20 74 6f 6b 65 6e 54 79 70 65  witch( tokenType
7a40: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
7a50: 4b 5f 53 50 41 43 45 3a 20 7b 0a 20 20 20 20 20  K_SPACE: {.     
7a60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7a70: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
7a80: 49 4c 4c 45 47 41 4c 3a 20 7b 0a 20 20 20 20 20  ILLEGAL: {.     
7a90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7aa0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  (db, z);.       
7ab0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
7ac0: 72 28 26 69 6e 48 61 73 68 29 3b 0a 20 20 20 20  r(&inHash);.    
7ad0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7ae0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
7af0: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
7b00: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
7b10: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46  .      case TK_F
7b20: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 63 61 73 65  LOAT:.      case
7b30: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
7b40: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
7b50: 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  : {.        z[j+
7b60: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20  +] = '?';.      
7b70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7b80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  .      case TK_L
7b90: 50 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  P:.      case TK
7ba0: 5f 52 50 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  _RP: {.        i
7bb0: 66 28 20 74 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b  f( tokenType==TK
7bc0: 5f 4c 50 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LP ){.         
7bd0: 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20   nParen++;.     
7be0: 20 20 20 20 20 69 66 28 20 70 72 65 76 54 6f 6b       if( prevTok
7bf0: 65 6e 54 79 70 65 3d 3d 54 4b 5f 49 4e 20 29 7b  enType==TK_IN ){
7c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
7c10: 65 72 74 28 20 6e 50 61 72 65 6e 3c 6e 53 71 6c  ert( nParen<nSql
7c20: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
7c30: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
7c40: 74 28 26 69 6e 48 61 73 68 2c 20 7a 53 71 6c 2b  t(&inHash, zSql+
7c50: 6e 50 61 72 65 6e 2c 20 53 51 4c 49 54 45 5f 49  nParen, SQLITE_I
7c60: 4e 54 5f 54 4f 5f 50 54 52 28 6a 29 29 3b 0a 20  NT_TO_PTR(j));. 
7c70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7c90: 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
7ca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 50        assert( nP
7cb0: 61 72 65 6e 3c 6e 53 71 6c 20 29 3b 0a 20 20 20  aren<nSql );.   
7cc0: 20 20 20 20 20 20 20 6a 6a 20 3d 20 53 51 4c 49         jj = SQLI
7cd0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71  TE_PTR_TO_INT(sq
7ce0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 69  lite3HashFind(&i
7cf0: 6e 48 61 73 68 2c 20 7a 53 71 6c 2b 6e 50 61 72  nHash, zSql+nPar
7d00: 65 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en));.          
7d10: 69 66 28 20 6a 6a 3e 30 20 29 7b 0a 20 20 20 20  if( jj>0 ){.    
7d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
7d30: 61 73 68 49 6e 73 65 72 74 28 26 69 6e 48 61 73  ashInsert(&inHas
7d40: 68 2c 20 7a 53 71 6c 2b 6e 50 61 72 65 6e 2c 20  h, zSql+nParen, 
7d50: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7d60: 61 73 73 65 72 74 28 20 6a 6a 2b 36 3c 6e 5a 20  assert( jj+6<nZ 
7d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  );.            m
7d80: 65 6d 63 70 79 28 7a 2b 6a 6a 2b 31 2c 20 22 3f  emcpy(z+jj+1, "?
7d90: 2c 3f 2c 3f 22 2c 20 35 29 3b 0a 20 20 20 20 20  ,?,?", 5);.     
7da0: 20 20 20 20 20 20 20 6a 20 3d 20 6a 6a 2b 36 3b         j = jj+6;
7db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
7dc0: 65 72 74 28 20 6e 5a 2d 31 2d 6a 3e 3d 30 20 29  ert( nZ-1-j>=0 )
7dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
7de0: 73 65 72 74 28 20 6e 5a 2d 31 2d 6a 3c 6e 5a 20  sert( nZ-1-j<nZ 
7df0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  );.            m
7e00: 65 6d 73 65 74 28 7a 2b 6a 2c 20 30 2c 20 6e 5a  emset(z+j, 0, nZ
7e10: 2d 31 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  -1-j);.         
7e20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61   }.          nPa
7e30: 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d  ren--;.        }
7e40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e50: 20 6e 50 61 72 65 6e 3e 3d 30 20 29 3b 0a 20 20   nParen>=0 );.  
7e60: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
7e70: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 20 20 7d  rough */.      }
7e80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  .      case TK_M
7e90: 49 4e 55 53 3a 0a 20 20 20 20 20 20 63 61 73 65  INUS:.      case
7ea0: 20 54 4b 5f 53 45 4d 49 3a 0a 20 20 20 20 20 20   TK_SEMI:.      
7eb0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
7ec0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
7ed0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
7ee0: 53 4c 41 53 48 3a 0a 20 20 20 20 20 20 63 61 73  SLASH:.      cas
7ef0: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 20 20  e TK_REM:.      
7f00: 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
7f10: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
7f20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
7f30: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53        case TK_LS
7f40: 48 49 46 54 3a 0a 20 20 20 20 20 20 63 61 73 65  HIFT:.      case
7f50: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 20 20 63 61   TK_LT:.      ca
7f60: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 0a 20 20  se TK_RSHIFT:.  
7f70: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
7f80: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45        case TK_GE
7f90: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
7fa0: 42 49 54 4f 52 3a 0a 20 20 20 20 20 20 63 61 73  BITOR:.      cas
7fb0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 0a 20 20 20  e TK_CONCAT:.   
7fc0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4d 4d 41     case TK_COMMA
7fd0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
7fe0: 42 49 54 41 4e 44 3a 0a 20 20 20 20 20 20 63 61  BITAND:.      ca
7ff0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
8000: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
8010: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
8020: 4e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  N:.      case TK
8030: 5f 49 53 3a 0a 20 20 20 20 20 20 63 61 73 65 20  _IS:.      case 
8040: 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 20 20 63 61  TK_NOT:.      ca
8050: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
8060: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a    case TK_ID: {.
8070: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 6b 65          if( toke
8080: 6e 54 79 70 65 3d 3d 54 4b 5f 4e 55 4c 4c 20 29  nType==TK_NULL )
8090: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
80a0: 70 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d 3d 54  prevTokenType==T
80b0: 4b 5f 49 53 20 7c 7c 20 70 72 65 76 54 6f 6b 65  K_IS || prevToke
80c0: 6e 54 79 70 65 3d 3d 54 4b 5f 4e 4f 54 20 29 7b  nType==TK_NOT ){
80d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
80e0: 4e 55 4c 4c 20 69 73 20 61 20 6b 65 79 77 6f 72  NULL is a keywor
80f0: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  d in this case, 
8100: 6e 6f 74 20 61 20 6c 69 74 65 72 61 6c 20 76 61  not a literal va
8110: 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  lue */.         
8120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8130: 20 20 20 20 2f 2a 20 48 65 72 65 20 74 68 65 20      /* Here the 
8140: 4e 55 4c 4c 20 69 73 20 61 20 6c 69 74 65 72 61  NULL is a litera
8150: 6c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  l value */.     
8160: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
8170: 27 3f 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  '?';.           
8180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8190: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
81a0: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 26 26        if( j>0 &&
81b0: 20 73 71 6c 69 74 65 33 49 73 49 64 43 68 61 72   sqlite3IsIdChar
81c0: 28 7a 5b 6a 2d 31 5d 29 20 26 26 20 73 71 6c 69  (z[j-1]) && sqli
81d0: 74 65 33 49 73 49 64 43 68 61 72 28 7a 53 71 6c  te3IsIdChar(zSql
81e0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
81f0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
8200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8210: 20 20 69 66 28 20 74 6f 6b 65 6e 54 79 70 65 3d    if( tokenType=
8220: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
8230: 20 20 20 20 69 6e 74 20 69 32 20 3d 20 69 2c 20      int i2 = i, 
8240: 6e 32 20 3d 20 6e 2c 20 72 63 20 3d 20 53 51 4c  n2 = n, rc = SQL
8250: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
8260: 20 20 69 66 28 20 6e 50 61 72 65 6e 3e 30 20 29    if( nParen>0 )
8270: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
8280: 73 65 72 74 28 20 6e 50 61 72 65 6e 3c 6e 53 71  sert( nParen<nSq
8290: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l );.           
82a0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
82b0: 72 74 28 26 69 6e 48 61 73 68 2c 20 7a 53 71 6c  rt(&inHash, zSql
82c0: 2b 6e 50 61 72 65 6e 2c 20 30 29 3b 0a 20 20 20  +nParen, 0);.   
82d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
82e0: 20 20 20 69 66 28 20 66 6c 61 67 73 26 53 51 4c     if( flags&SQL
82f0: 49 54 45 5f 54 4f 4b 45 4e 5f 51 55 4f 54 45 44  ITE_TOKEN_QUOTED
8300: 20 29 7b 20 69 32 2b 2b 3b 20 6e 32 2d 3d 32 3b   ){ i2++; n2-=2;
8310: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
8320: 20 73 68 6f 75 6c 64 54 72 65 61 74 41 73 49 64   shouldTreatAsId
8330: 65 6e 74 69 66 69 65 72 28 64 62 2c 20 7a 53 71  entifier(db, zSq
8340: 6c 2b 69 32 2c 20 6e 32 2c 20 26 72 63 29 3d 3d  l+i2, n2, &rc)==
8350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8370: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
8380: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8390: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
83a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
83b0: 61 73 68 43 6c 65 61 72 28 26 69 6e 48 61 73 68  ashClear(&inHash
83c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
83d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
83e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
83f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6b     if( sqlite3_k
8400: 65 79 77 6f 72 64 5f 63 68 65 63 6b 28 7a 53 71  eyword_check(zSq
8410: 6c 2b 69 32 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a  l+i2, n2)==0 ){.
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b                z[
8430: 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
8440: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8460: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 70     }.        cop
8480: 79 4e 6f 72 6d 61 6c 69 7a 65 64 54 6f 6b 65 6e  yNormalizedToken
8490: 28 7a 53 71 6c 2c 20 69 2c 20 6e 2c 20 66 6c 61  (zSql, i, n, fla
84a0: 67 73 2c 20 7a 2c 20 26 6a 29 3b 0a 20 20 20 20  gs, z, &j);.    
84b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
84c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
84d0: 73 73 65 72 74 28 20 6a 3c 6e 5a 20 26 26 20 22  ssert( j<nZ && "
84e0: 6f 6e 65 22 20 29 3b 0a 20 20 77 68 69 6c 65 28  one" );.  while(
84f0: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 3d 3d   j>0 && z[j-1]==
8500: 27 20 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  ' ' ){ j--; }.  
8510: 69 66 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31  if( j>0 && z[j-1
8520: 5d 21 3d 27 3b 27 20 29 7b 20 7a 5b 6a 2b 2b 5d  ]!=';' ){ z[j++]
8530: 20 3d 20 27 3b 27 3b 20 7d 0a 20 20 7a 5b 6a 5d   = ';'; }.  z[j]
8540: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
8550: 6a 3c 6e 5a 20 26 26 20 22 74 77 6f 22 20 29 3b  j<nZ && "two" );
8560: 0a 20 20 70 56 64 62 65 2d 3e 7a 4e 6f 72 6d 53  .  pVdbe->zNormS
8570: 71 6c 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65  ql = z;.  sqlite
8580: 33 48 61 73 68 43 6c 65 61 72 28 26 69 6e 48 61  3HashClear(&inHa
8590: 73 68 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sh);.}.#endif /*
85a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
85b0: 4f 52 4d 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a  ORMALIZE */../*.
85c0: 2a 2a 20 52 65 72 75 6e 20 74 68 65 20 63 6f 6d  ** Rerun the com
85d0: 70 69 6c 61 74 69 6f 6e 20 6f 66 20 61 20 73 74  pilation of a st
85e0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 61 20  atement after a 
85f0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e 0a 2a  schema change..*
8600: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 61 74  *.** If the stat
8610: 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73 73  ement is success
8620: 66 75 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64  fully recompiled
8630: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
8640: 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  OK. Otherwise,.*
8650: 2a 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  * if the stateme
8660: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 63  nt cannot be rec
8670: 6f 6d 70 69 6c 65 64 20 62 65 63 61 75 73 65 20  ompiled because 
8680: 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
8690: 6f 6e 20 68 61 73 0a 2a 2a 20 6c 6f 63 6b 65 64  on has.** locked
86a0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 73   the sqlite3_mas
86b0: 74 65 72 20 74 61 62 6c 65 2c 20 72 65 74 75 72  ter table, retur
86c0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
86d0: 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20 65 72   If any other er
86e0: 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  ror.** occurs, r
86f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 43 48  eturn SQLITE_SCH
8700: 45 4d 41 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  EMA..*/.int sqli
8710: 74 65 33 52 65 70 72 65 70 61 72 65 28 56 64 62  te3Reprepare(Vdb
8720: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
8730: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
8740: 2a 70 4e 65 77 3b 0a 20 20 63 6f 6e 73 74 20 63  *pNew;.  const c
8750: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c  har *zSql;.  sql
8760: 69 74 65 33 20 2a 64 62 3b 0a 20 20 75 38 20 70  ite3 *db;.  u8 p
8770: 72 65 70 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  repFlags;..  ass
8780: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8790: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 56  ex_held(sqlite3V
87a0: 64 62 65 44 62 28 70 29 2d 3e 6d 75 74 65 78 29  dbeDb(p)->mutex)
87b0: 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c   );.  zSql = sql
87c0: 69 74 65 33 5f 73 71 6c 28 28 73 71 6c 69 74 65  ite3_sql((sqlite
87d0: 33 5f 73 74 6d 74 20 2a 29 70 29 3b 0a 20 20 61  3_stmt *)p);.  a
87e0: 73 73 65 72 74 28 20 7a 53 71 6c 21 3d 30 20 29  ssert( zSql!=0 )
87f0: 3b 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20  ;  /* Reprepare 
8800: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
8810: 70 72 65 70 61 72 65 5f 76 32 28 29 20 73 74 61  prepare_v2() sta
8820: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 64 62 20  tements */.  db 
8830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  = sqlite3VdbeDb(
8840: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p);.  assert( sq
8850: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8860: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
8870: 20 70 72 65 70 46 6c 61 67 73 20 3d 20 73 71 6c   prepFlags = sql
8880: 69 74 65 33 56 64 62 65 50 72 65 70 61 72 65 46  ite3VdbePrepareF
8890: 6c 61 67 73 28 70 29 3b 0a 20 20 72 63 20 3d 20  lags(p);.  rc = 
88a0: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
88b0: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
88c0: 2d 31 2c 20 70 72 65 70 46 6c 61 67 73 2c 20 70  -1, prepFlags, p
88d0: 2c 20 26 70 4e 65 77 2c 20 30 29 3b 0a 20 20 69  , &pNew, 0);.  i
88e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
88f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
8900: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
8910: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
8920: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
8930: 28 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  ( pNew==0 );.   
8940: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65   return rc;.  }e
8950: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
8960: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 7d 0a   pNew!=0 );.  }.
8970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61    sqlite3VdbeSwa
8980: 70 28 28 56 64 62 65 2a 29 70 4e 65 77 2c 20 70  p((Vdbe*)pNew, p
8990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 61 6e  );.  sqlite3Tran
89a0: 73 66 65 72 42 69 6e 64 69 6e 67 73 28 70 4e 65  sferBindings(pNe
89b0: 77 2c 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  w, (sqlite3_stmt
89c0: 2a 29 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  *)p);.  sqlite3V
89d0: 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
89e0: 6c 74 28 28 56 64 62 65 2a 29 70 4e 65 77 29 3b  lt((Vdbe*)pNew);
89f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  .  sqlite3VdbeFi
8a00: 6e 61 6c 69 7a 65 28 28 56 64 62 65 2a 29 70 4e  nalize((Vdbe*)pN
8a10: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ew);.  return SQ
8a20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
8a30: 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
8a40: 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20  of the official 
8a50: 41 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64  API.  Legacy and
8a60: 20 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68   new use.  In th
8a70: 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73  e legacy.** vers
8a80: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
8a90: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f  l SQL text is no
8aa0: 74 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70  t saved in the p
8ab0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8ac0: 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61  t.** and so if a
8ad0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f   schema change o
8ae0: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43  ccurs, SQLITE_SC
8af0: 48 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64  HEMA is returned
8b00: 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73   by.** sqlite3_s
8b10: 74 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e  tep().  In the n
8b20: 65 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ew version, the 
8b30: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
8b40: 74 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a  t is retained.**
8b50: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
8b60: 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  nt is automatica
8b70: 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69  lly recompiled i
8b80: 66 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e  f an schema chan
8b90: 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  ge.** occurs..*/
8ba0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  .int sqlite3_pre
8bb0: 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
8bc0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
8bd0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
8be0: 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ndle. */.  const
8bf0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
8c00: 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e       /* UTF-8 en
8c10: 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d  coded SQL statem
8c20: 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ent. */.  int nB
8c30: 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  ytes,           
8c40: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
8c50: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20   zSql in bytes. 
8c60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
8c70: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f  t **ppStmt,    /
8c80: 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72  * OUT: A pointer
8c90: 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   to the prepared
8ca0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8cb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54  const char **pzT
8cc0: 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ail       /* OUT
8cd0: 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20  : End of parsed 
8ce0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
8cf0: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
8d00: 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70  lite3LockAndPrep
8d10: 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  are(db,zSql,nByt
8d20: 65 73 2c 30 2c 30 2c 70 70 53 74 6d 74 2c 70 7a  es,0,0,ppStmt,pz
8d30: 54 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Tail);.  assert(
8d40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
8d50: 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a  | ppStmt==0 || *
8d60: 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a  ppStmt==0 );  /*
8d70: 20 56 45 52 49 46 59 3a 20 46 31 33 30 32 31 20   VERIFY: F13021 
8d80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
8d90: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72  }.int sqlite3_pr
8da0: 65 70 61 72 65 5f 76 32 28 0a 20 20 73 71 6c 69  epare_v2(.  sqli
8db0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
8dc0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8dd0: 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63  e handle. */.  c
8de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
8df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
8e00: 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  8 encoded SQL st
8e10: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
8e20: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
8e30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
8e40: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
8e50: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
8e60: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
8e70: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
8e80: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
8e90: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
8ea0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8eb0: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
8ec0: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
8ed0: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
8ee0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2f 2a 20  .  int rc;.  /* 
8ef0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
8f00: 37 39 32 33 2d 31 32 31 37 33 20 54 68 65 20 73  7923-12173 The s
8f10: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
8f20: 32 28 29 20 69 6e 74 65 72 66 61 63 65 20 77 6f  2() interface wo
8f30: 72 6b 73 0a 20 20 2a 2a 20 65 78 61 63 74 6c 79  rks.  ** exactly
8f40: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
8f50: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28  ite3_prepare_v3(
8f60: 29 20 77 69 74 68 20 61 20 7a 65 72 6f 20 70 72  ) with a zero pr
8f70: 65 70 46 6c 61 67 73 0a 20 20 2a 2a 20 70 61 72  epFlags.  ** par
8f80: 61 6d 65 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  ameter..  **.  *
8f90: 2a 20 50 72 6f 6f 66 20 69 6e 20 74 68 61 74 20  * Proof in that 
8fa0: 74 68 65 20 35 74 68 20 70 61 72 61 6d 65 74 65  the 5th paramete
8fb0: 72 20 74 6f 20 73 71 6c 69 74 65 33 4c 6f 63 6b  r to sqlite3Lock
8fc0: 41 6e 64 50 72 65 70 61 72 65 20 69 73 20 30 20  AndPrepare is 0 
8fd0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
8fe0: 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28  3LockAndPrepare(
8ff0: 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 53  db,zSql,nBytes,S
9000: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
9010: 56 45 53 51 4c 2c 30 2c 0a 20 20 20 20 20 20 20  VESQL,0,.       
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 20 70 70 53 74 6d 74 2c 70 7a 54        ppStmt,pzT
9040: 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ail);.  assert( 
9050: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9060: 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70   ppStmt==0 || *p
9070: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 72 65  pStmt==0 );.  re
9080: 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
9090: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
90a0: 33 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  3(.  sqlite3 *db
90b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
90c0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
90d0: 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e. */.  const ch
90e0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
90f0: 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64    /* UTF-8 encod
9100: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
9110: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
9120: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
9130: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
9140: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
9150: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70    unsigned int p
9160: 72 65 70 46 6c 61 67 73 2c 20 20 20 2f 2a 20 5a  repFlags,   /* Z
9170: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49  ero or more SQLI
9180: 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61  TE_PREPARE_* fla
9190: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
91a0: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
91b0: 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e    /* OUT: A poin
91c0: 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70 61  ter to the prepa
91d0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
91e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
91f0: 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20  pzTail       /* 
9200: 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73  OUT: End of pars
9210: 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ed string */.){.
9220: 20 20 69 6e 74 20 72 63 3b 0a 20 20 2f 2a 20 45    int rc;.  /* E
9230: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36  VIDENCE-OF: R-56
9240: 38 36 31 2d 34 32 36 37 33 20 73 71 6c 69 74 65  861-42673 sqlite
9250: 33 5f 70 72 65 70 61 72 65 5f 76 33 28 29 20 64  3_prepare_v3() d
9260: 69 66 66 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  iffers from.  **
9270: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
9280: 5f 76 32 28 29 20 6f 6e 6c 79 20 69 6e 20 68 61  _v2() only in ha
9290: 76 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 70  ving the extra p
92a0: 72 65 70 46 6c 61 67 73 20 70 61 72 61 6d 65 74  repFlags paramet
92b0: 65 72 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69  er,.  ** which i
92c0: 73 20 61 20 62 69 74 20 61 72 72 61 79 20 63 6f  s a bit array co
92d0: 6e 73 69 73 74 69 6e 67 20 6f 66 20 7a 65 72 6f  nsisting of zero
92e0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0a   or more of the.
92f0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 50 52 45 50    ** SQLITE_PREP
9300: 41 52 45 5f 2a 20 66 6c 61 67 73 2e 0a 20 20 2a  ARE_* flags..  *
9310: 2a 0a 20 20 2a 2a 20 50 72 6f 6f 66 20 62 79 20  *.  ** Proof by 
9320: 63 6f 6d 70 61 72 69 73 6f 6e 20 74 6f 20 74 68  comparison to th
9330: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
9340: 20 6f 66 20 73 71 6c 69 74 65 33 5f 70 72 65 70   of sqlite3_prep
9350: 61 72 65 5f 76 32 28 29 0a 20 20 2a 2a 20 64 69  are_v2().  ** di
9360: 72 65 63 74 6c 79 20 61 62 6f 76 65 2e 20 2a 2f  rectly above. */
9370: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c  .  rc = sqlite3L
9380: 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62  ockAndPrepare(db
9390: 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 0a 20 20  ,zSql,nBytes,.  
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
93b0: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
93c0: 56 45 53 51 4c 7c 28 70 72 65 70 46 6c 61 67 73  VESQL|(prepFlags
93d0: 26 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f  &SQLITE_PREPARE_
93e0: 4d 41 53 4b 29 2c 0a 20 20 20 20 20 20 20 20 20  MASK),.         
93f0: 20 20 20 20 20 20 20 20 30 2c 70 70 53 74 6d 74          0,ppStmt
9400: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
9410: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
9420: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
9430: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  | *ppStmt==0 );.
9440: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9460: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
9470: 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46   Compile the UTF
9480: 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20  -16 encoded SQL 
9490: 73 74 61 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69  statement zSql i
94a0: 6e 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20  nto a statement 
94b0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
94c0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 72 65  c int sqlite3Pre
94d0: 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65  pare16(.  sqlite
94e0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
94f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9500: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
9510: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
9520: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31          /* UTF-1
9530: 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  6 encoded SQL st
9540: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
9550: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
9560: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9570: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
9580: 65 73 2e 20 2a 2f 0a 20 20 75 33 32 20 70 72 65  es. */.  u32 pre
9590: 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
95a0: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
95b0: 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  re SQLITE_PREPAR
95c0: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  E_* flags */.  s
95d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
95e0: 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt,    /* OUT:
95f0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
9600: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
9610: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
9620: 76 6f 69 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20  void **pzTail   
9630: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20      /* OUT: End 
9640: 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67  of parsed string
9650: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 54 68 69 73   */.){.  /* This
9660: 20 66 75 6e 63 74 69 6f 6e 20 63 75 72 72 65 6e   function curren
9670: 74 6c 79 20 77 6f 72 6b 73 20 62 79 20 66 69 72  tly works by fir
9680: 73 74 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  st transforming 
9690: 74 68 65 20 55 54 46 2d 31 36 0a 20 20 2a 2a 20  the UTF-16.  ** 
96a0: 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20 74  encoded string t
96b0: 6f 20 55 54 46 2d 38 2c 20 74 68 65 6e 20 69 6e  o UTF-8, then in
96c0: 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 70  voking sqlite3_p
96d0: 72 65 70 61 72 65 28 29 2e 20 54 68 65 0a 20 20  repare(). The.  
96e0: 2a 2a 20 74 72 69 63 6b 79 20 62 69 74 20 69 73  ** tricky bit is
96f0: 20 66 69 67 75 72 69 6e 67 20 6f 75 74 20 74 68   figuring out th
9700: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 74  e pointer to ret
9710: 75 72 6e 20 69 6e 20 2a 70 7a 54 61 69 6c 2e 0a  urn in *pzTail..
9720: 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71    */.  char *zSq
9730: 6c 38 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l8;.  const char
9740: 20 2a 7a 54 61 69 6c 38 20 3d 20 30 3b 0a 20 20   *zTail8 = 0;.  
9750: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9760: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
9770: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
9780: 4d 4f 52 0a 20 20 69 66 28 20 70 70 53 74 6d 74  MOR.  if( ppStmt
9790: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
97a0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
97b0: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 53 74 6d  .#endif.  *ppStm
97c0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 73 71  t = 0;.  if( !sq
97d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
97e0: 4f 6b 28 64 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20  Ok(db)||zSql==0 
97f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9800: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
9810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74  ;.  }.  if( nByt
9820: 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  es>=0 ){.    int
9830: 20 73 7a 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   sz;.    const c
9840: 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
9850: 63 68 61 72 2a 29 7a 53 71 6c 3b 0a 20 20 20 20  char*)zSql;.    
9860: 66 6f 72 28 73 7a 3d 30 3b 20 73 7a 3c 6e 42 79  for(sz=0; sz<nBy
9870: 74 65 73 20 26 26 20 28 7a 5b 73 7a 5d 21 3d 30  tes && (z[sz]!=0
9880: 20 7c 7c 20 7a 5b 73 7a 2b 31 5d 21 3d 30 29 3b   || z[sz+1]!=0);
9890: 20 73 7a 20 2b 3d 20 32 29 7b 7d 0a 20 20 20 20   sz += 2){}.    
98a0: 6e 42 79 74 65 73 20 3d 20 73 7a 3b 0a 20 20 7d  nBytes = sz;.  }
98b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
98c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
98d0: 29 3b 0a 20 20 7a 53 71 6c 38 20 3d 20 73 71 6c  );.  zSql8 = sql
98e0: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
98f0: 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 53   zSql, nBytes, S
9900: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
9910: 45 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 38 20  E);.  if( zSql8 
9920: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9930: 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72  te3LockAndPrepar
9940: 65 28 64 62 2c 20 7a 53 71 6c 38 2c 20 2d 31 2c  e(db, zSql8, -1,
9950: 20 70 72 65 70 46 6c 61 67 73 2c 20 30 2c 20 70   prepFlags, 0, p
9960: 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 38 29 3b  pStmt, &zTail8);
9970: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
9980: 6c 38 20 26 26 20 70 7a 54 61 69 6c 20 29 7b 0a  l8 && pzTail ){.
9990: 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
99a0: 33 5f 70 72 65 70 61 72 65 20 72 65 74 75 72 6e  3_prepare return
99b0: 73 20 61 20 74 61 69 6c 20 70 6f 69 6e 74 65 72  s a tail pointer
99c0: 2c 20 77 65 20 63 61 6c 63 75 6c 61 74 65 20 74  , we calculate t
99d0: 68 65 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  he.    ** equiva
99e0: 6c 65 6e 74 20 70 6f 69 6e 74 65 72 20 69 6e 74  lent pointer int
99f0: 6f 20 74 68 65 20 55 54 46 2d 31 36 20 73 74 72  o the UTF-16 str
9a00: 69 6e 67 20 62 79 20 63 6f 75 6e 74 69 6e 67 20  ing by counting 
9a10: 74 68 65 20 75 6e 69 63 6f 64 65 0a 20 20 20 20  the unicode.    
9a20: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 62 65  ** characters be
9a30: 74 77 65 65 6e 20 7a 53 71 6c 38 20 61 6e 64 20  tween zSql8 and 
9a40: 7a 54 61 69 6c 38 2c 20 61 6e 64 20 74 68 65 6e  zTail8, and then
9a50: 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
9a60: 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20  nter.    ** the 
9a70: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63  same number of c
9a80: 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 74  haracters into t
9a90: 68 65 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  he UTF-16 string
9aa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9ab0: 20 63 68 61 72 73 5f 70 61 72 73 65 64 20 3d 20   chars_parsed = 
9ac0: 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
9ad0: 65 6e 28 7a 53 71 6c 38 2c 20 28 69 6e 74 29 28  en(zSql8, (int)(
9ae0: 7a 54 61 69 6c 38 2d 7a 53 71 6c 38 29 29 3b 0a  zTail8-zSql8));.
9af0: 20 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20 28 75      *pzTail = (u
9b00: 38 20 2a 29 7a 53 71 6c 20 2b 20 73 71 6c 69 74  8 *)zSql + sqlit
9b10: 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a  e3Utf16ByteLen(z
9b20: 53 71 6c 2c 20 63 68 61 72 73 5f 70 61 72 73 65  Sql, chars_parse
9b30: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
9b40: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
9b50: 38 29 3b 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  8); .  rc = sqli
9b60: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
9b70: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
9b80: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9b90: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
9ba0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  c;.}../*.** Two 
9bb0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9bc0: 6f 66 66 69 63 69 61 6c 20 41 50 49 2e 20 20 4c  official API.  L
9bd0: 65 67 61 63 79 20 61 6e 64 20 6e 65 77 20 75 73  egacy and new us
9be0: 65 2e 20 20 49 6e 20 74 68 65 20 6c 65 67 61 63  e.  In the legac
9bf0: 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 74 68  y.** version, th
9c00: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
9c10: 65 78 74 20 69 73 20 6e 6f 74 20 73 61 76 65 64  ext is not saved
9c20: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
9c30: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
9c40: 64 20 73 6f 20 69 66 20 61 20 73 63 68 65 6d 61  d so if a schema
9c50: 20 63 68 61 6e 67 65 20 6f 63 63 75 72 73 2c 20   change occurs, 
9c60: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 73  SQLITE_SCHEMA is
9c70: 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20   returned by.** 
9c80: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
9c90: 20 49 6e 20 74 68 65 20 6e 65 77 20 76 65 72 73   In the new vers
9ca0: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
9cb0: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 72 65  l SQL text is re
9cc0: 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68  tained.** and th
9cd0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  e statement is a
9ce0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65 63  utomatically rec
9cf0: 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e 20 73 63  ompiled if an sc
9d00: 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a 2a 20 6f  hema change.** o
9d10: 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
9d20: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28  lite3_prepare16(
9d30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d50: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
9d60: 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69   */ .  const voi
9d70: 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  d *zSql,        
9d80: 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   /* UTF-16 encod
9d90: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
9da0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
9db0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
9dc0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
9dd0: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
9de0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9df0: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
9e00: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
9e10: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
9e20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
9e30: 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61 69 6c  st void **pzTail
9e40: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
9e50: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
9e60: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
9e70: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
9e80: 65 33 50 72 65 70 61 72 65 31 36 28 64 62 2c 7a  e3Prepare16(db,z
9e90: 53 71 6c 2c 6e 42 79 74 65 73 2c 30 2c 70 70 53  Sql,nBytes,0,ppS
9ea0: 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61  tmt,pzTail);.  a
9eb0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
9ec0: 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d  E_OK || ppStmt==
9ed0: 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  0 || *ppStmt==0 
9ee0: 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20 46  );  /* VERIFY: F
9ef0: 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75 72  13021 */.  retur
9f00: 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
9f10: 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
9f20: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9f40: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
9f50: 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f  . */ .  const vo
9f60: 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  id *zSql,       
9f70: 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f    /* UTF-16 enco
9f80: 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ded SQL statemen
9f90: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  t. */.  int nByt
9fa0: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  es,             
9fb0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
9fc0: 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f  Sql in bytes. */
9fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9fe0: 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20  **ppStmt,    /* 
9ff0: 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74  OUT: A pointer t
a000: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
a010: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
a020: 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61 69  nst void **pzTai
a030: 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  l       /* OUT: 
a040: 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74  End of parsed st
a050: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
a060: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
a070: 74 65 33 50 72 65 70 61 72 65 31 36 28 64 62 2c  te3Prepare16(db,
a080: 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 53 51 4c 49  zSql,nBytes,SQLI
a090: 54 45 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53  TE_PREPARE_SAVES
a0a0: 51 4c 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c  QL,ppStmt,pzTail
a0b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
a0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70  =SQLITE_OK || pp
a0d0: 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74  Stmt==0 || *ppSt
a0e0: 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52  mt==0 );  /* VER
a0f0: 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20  IFY: F13021 */. 
a100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
a110: 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  t sqlite3_prepar
a120: 65 31 36 5f 76 33 28 0a 20 20 73 71 6c 69 74 65  e16_v3(.  sqlite
a130: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a140: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
a150: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
a160: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
a170: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31          /* UTF-1
a180: 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  6 encoded SQL st
a190: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
a1a0: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
a1b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
a1c0: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
a1d0: 65 73 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  es. */.  unsigne
a1e0: 64 20 69 6e 74 20 70 72 65 70 46 6c 61 67 73 2c  d int prepFlags,
a1f0: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
a200: 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  re SQLITE_PREPAR
a210: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  E_* flags */.  s
a220: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
a230: 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt,    /* OUT:
a240: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
a250: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
a260: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
a270: 76 6f 69 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20  void **pzTail   
a280: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20      /* OUT: End 
a290: 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67  of parsed string
a2a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
a2b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
a2c0: 72 65 70 61 72 65 31 36 28 64 62 2c 7a 53 71 6c  repare16(db,zSql
a2d0: 2c 6e 42 79 74 65 73 2c 0a 20 20 20 20 20 20 20  ,nBytes,.       
a2e0: 20 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45    SQLITE_PREPARE
a2f0: 5f 53 41 56 45 53 51 4c 7c 28 70 72 65 70 46 6c  _SAVESQL|(prepFl
a300: 61 67 73 26 53 51 4c 49 54 45 5f 50 52 45 50 41  ags&SQLITE_PREPA
a310: 52 45 5f 4d 41 53 4b 29 2c 0a 20 20 20 20 20 20  RE_MASK),.      
a320: 20 20 20 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c     ppStmt,pzTail
a330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
a340: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70  =SQLITE_OK || pp
a350: 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74  Stmt==0 || *ppSt
a360: 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52  mt==0 );  /* VER
a370: 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20  IFY: F13021 */. 
a380: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
a390: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a3a0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a        OMIT_UTF16 */.