/ Hex Artifact Content
Login

Artifact fc8c448c4df0c23d5087e8069a2e03598ed1be9a567c9bc70f49b829e76b61ad:


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 2c 20 63 6f 6e 73 74 20 63 68 61  chema, const cha
4380: 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 69  r *zDb){.  int i
4390: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
43a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
43b0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
43c0: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 69  if( zDb ){.    i
43d0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
43e0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
43f0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
4400: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
4410: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4420: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
4430: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
4440: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
4450: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4460: 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  t( sqlite3StrICm
4470: 70 28 7a 44 62 2c 20 22 74 65 6d 70 22 29 3d 3d  p(zDb, "temp")==
4480: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
4490: 66 20 70 53 63 68 65 6d 61 20 69 73 20 4e 55 4c  f pSchema is NUL
44a0: 4c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 2d  L, then return -
44b0: 31 30 30 30 30 30 30 2e 20 54 68 69 73 20 68 61  1000000. This ha
44c0: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 65 20  ppens when code 
44d0: 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e 63 20  in .  ** expr.c 
44e0: 69 73 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73  is trying to res
44f0: 6f 6c 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  olve a reference
4500: 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
4510: 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e 65 0a  table (i.e. one.
4520: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
4530: 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2e 20 49  a sub-select). I
4540: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
4550: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
4560: 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74  this .  ** funct
4570: 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ion should never
4580: 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 0a 20   be used..  **. 
4590: 20 2a 2a 20 57 65 20 72 65 74 75 72 6e 20 2d 31   ** We return -1
45a0: 30 30 30 30 30 30 20 69 6e 73 74 65 61 64 20 6f  000000 instead o
45b0: 66 20 74 68 65 20 6d 6f 72 65 20 75 73 75 61 6c  f the more usual
45c0: 20 2d 31 20 73 69 6d 70 6c 79 20 62 65 63 61 75   -1 simply becau
45d0: 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20 2d 31  se using.  ** -1
45e0: 30 30 30 30 30 30 20 61 73 20 74 68 65 20 69 6e  000000 as the in
45f0: 63 6f 72 72 65 63 74 20 69 6e 64 65 78 20 69 6e  correct index in
4600: 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69 73 20  to db->aDb[] is 
4610: 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72 65 20  much .  ** more 
4620: 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75 73 65 20  likely to cause 
4630: 61 20 73 65 67 66 61 75 6c 74 20 74 68 61 6e 20  a segfault than 
4640: 2d 31 20 28 6f 66 20 63 6f 75 72 73 65 20 74 68  -1 (of course th
4650: 65 72 65 20 61 72 65 20 61 73 73 65 72 74 28 29  ere are assert()
4660: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  .  ** statements
4670: 20 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e 65 76   too, but it nev
4680: 65 72 20 68 75 72 74 73 20 74 6f 20 70 6c 61 79  er hurts to play
4690: 20 74 68 65 20 6f 64 64 73 29 2e 0a 20 20 2a 2f   the odds)..  */
46a0: 0a 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29  .  if( pSchema )
46b0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 31  {.    for(i=0; 1
46c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
46d0: 73 65 72 74 28 20 69 3c 64 62 2d 3e 6e 44 62 20  sert( i<db->nDb 
46e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
46f0: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3d  >aDb[i].pSchema=
4700: 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  =pSchema ){.    
4710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4720: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
4730: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 64  ert( i>=0 && i<d
4740: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7d 65 6c 73  b->nDb );.  }els
4750: 65 7b 0a 20 20 20 20 69 20 3d 20 2d 31 30 30 30  e{.    i = -1000
4760: 30 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  000;.  }.  retur
4770: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  n i;.}../*.** Fr
4780: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c  ee all memory al
4790: 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 74 68 65  locations in the
47a0: 20 70 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a   pParse object.*
47b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
47c0: 72 73 65 72 52 65 73 65 74 28 50 61 72 73 65 20  rserReset(Parse 
47d0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
47e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
47f0: 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->db;.  sqlite3D
4800: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
4810: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
4820: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4830: 74 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  te(db, pParse->p
4840: 43 6f 6e 73 74 45 78 70 72 29 3b 0a 20 20 69 66  ConstExpr);.  if
4850: 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
4860: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
4870: 65 2e 62 44 69 73 61 62 6c 65 20 3e 3d 20 70 50  e.bDisable >= pP
4880: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f  arse->disableLoo
4890: 6b 61 73 69 64 65 20 29 3b 0a 20 20 20 20 64 62  kaside );.    db
48a0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
48b0: 61 62 6c 65 20 2d 3d 20 70 50 61 72 73 65 2d 3e  able -= pParse->
48c0: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65  disableLookaside
48d0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
48e0: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65  disableLookaside
48f0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
4900: 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46 2d 38  ompile the UTF-8
4910: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
4920: 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f  tement zSql into
4930: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
4940: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
4950: 6e 74 20 73 71 6c 69 74 65 33 50 72 65 70 61 72  nt sqlite3Prepar
4960: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
4970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4980: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
4990: 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e. */.  const ch
49a0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
49b0: 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64    /* UTF-8 encod
49c0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
49d0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  . */.  int nByte
49e0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
49f0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
4a00: 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a  ql in bytes. */.
4a10: 20 20 75 33 32 20 70 72 65 70 46 6c 61 67 73 2c    u32 prepFlags,
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a              /* Z
4a30: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49  ero or more SQLI
4a40: 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61  TE_PREPARE_* fla
4a50: 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 70 52  gs */.  Vdbe *pR
4a60: 65 70 72 65 70 61 72 65 2c 20 20 20 20 20 20 20  eprepare,       
4a70: 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65    /* VM being re
4a80: 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20 73 71  prepared */.  sq
4a90: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
4aa0: 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20  tmt,    /* OUT: 
4ab0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
4ac0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
4ad0: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
4ae0: 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20  har **pzTail    
4af0: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f     /* OUT: End o
4b00: 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20  f parsed string 
4b10: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
4b20: 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
4b30: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
4b40: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ge */.  int rc =
4b50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4b60: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
4b70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
4ba0: 2a 2f 0a 20 20 50 61 72 73 65 20 73 50 61 72 73  */.  Parse sPars
4bb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4bc0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
4bd0: 74 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26  t */..  memset(&
4be0: 73 50 61 72 73 65 2c 20 30 2c 20 50 41 52 53 45  sParse, 0, PARSE
4bf0: 5f 48 44 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  _HDR_SZ);.  mems
4c00: 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28 26 73  et(PARSE_TAIL(&s
4c10: 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52 53 45  Parse), 0, PARSE
4c20: 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 50 61  _TAIL_SZ);.  sPa
4c30: 72 73 65 2e 70 52 65 70 72 65 70 61 72 65 20 3d  rse.pReprepare =
4c40: 20 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 61   pReprepare;.  a
4c50: 73 73 65 72 74 28 20 70 70 53 74 6d 74 20 26 26  ssert( ppStmt &&
4c60: 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20   *ppStmt==0 );. 
4c70: 20 2f 2a 20 61 73 73 65 72 74 28 20 21 64 62 2d   /* assert( !db-
4c80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4c90: 20 2f 2f 20 6e 6f 74 20 74 72 75 65 20 77 69 74   // not true wit
4ca0: 68 20 53 51 4c 49 54 45 5f 55 53 45 5f 41 4c 4c  h SQLITE_USE_ALL
4cb0: 4f 43 41 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OCA */.  assert(
4cc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
4cd0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
4ce0: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 6c 6f  ;..  /* For a lo
4cf0: 6e 67 2d 74 65 72 6d 20 75 73 65 20 70 72 65 70  ng-term use prep
4d00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
4d10: 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 0a  void the use of.
4d20: 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d    ** lookaside m
4d30: 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  emory..  */.  if
4d40: 28 20 70 72 65 70 46 6c 61 67 73 20 26 20 53 51  ( prepFlags & SQ
4d50: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52  LITE_PREPARE_PER
4d60: 53 49 53 54 45 4e 54 20 29 7b 0a 20 20 20 20 73  SISTENT ){.    s
4d70: 50 61 72 73 65 2e 64 69 73 61 62 6c 65 4c 6f 6f  Parse.disableLoo
4d80: 6b 61 73 69 64 65 2b 2b 3b 0a 20 20 20 20 64 62  kaside++;.    db
4d90: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
4da0: 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  able++;.  }..  /
4db0: 2a 20 43 68 65 63 6b 20 74 6f 20 76 65 72 69 66  * Check to verif
4dc0: 79 20 74 68 61 74 20 69 74 20 69 73 20 70 6f 73  y that it is pos
4dd0: 73 69 62 6c 65 20 74 6f 20 67 65 74 20 61 20 72  sible to get a r
4de0: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 0a  ead lock on all.
4df0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
4e00: 68 65 6d 61 73 2e 20 20 54 68 65 20 69 6e 61 62  hemas.  The inab
4e10: 69 6c 69 74 79 20 74 6f 20 67 65 74 20 61 20 72  ility to get a r
4e20: 65 61 64 20 6c 6f 63 6b 20 69 6e 64 69 63 61 74  ead lock indicat
4e30: 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 73 6f 6d  es that.  ** som
4e40: 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
4e50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
4e60: 6f 6c 64 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  olding a write-l
4e70: 6f 63 6b 2c 20 77 68 69 63 68 20 69 6e 0a 20 20  ock, which in.  
4e80: 2a 2a 20 74 75 72 6e 20 6d 65 61 6e 73 20 74 68  ** turn means th
4e90: 61 74 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  at the other con
4ea0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  nection has made
4eb0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 68 61   uncommitted cha
4ec0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nges.  ** to the
4ed0: 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2a 0a 20 20   schema..  **.  
4ee0: 2a 2a 20 57 65 72 65 20 77 65 20 74 6f 20 70 72  ** Were we to pr
4ef0: 6f 63 65 65 64 20 61 6e 64 20 70 72 65 70 61 72  oceed and prepar
4f00: 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
4f10: 61 67 61 69 6e 73 74 20 74 68 65 20 75 6e 63 6f  against the unco
4f20: 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 73 63 68  mmitted.  ** sch
4f30: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ema changes and 
4f40: 69 66 20 74 68 6f 73 65 20 73 63 68 65 6d 61 20  if those schema 
4f50: 63 68 61 6e 67 65 73 20 61 72 65 20 73 75 62 73  changes are subs
4f60: 65 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65 64 0a  equently rolled.
4f70: 20 20 2a 2a 20 62 61 63 6b 20 61 6e 64 20 64 69    ** back and di
4f80: 66 66 65 72 65 6e 74 20 63 68 61 6e 67 65 73 20  fferent changes 
4f90: 61 72 65 20 6d 61 64 65 20 69 6e 20 74 68 65 69  are made in thei
4fa0: 72 20 70 6c 61 63 65 2c 20 74 68 65 6e 20 77 68  r place, then wh
4fb0: 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 65  en this.  ** pre
4fc0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4fd0: 67 6f 65 73 20 74 6f 20 72 75 6e 20 74 68 65 20  goes to run the 
4fe0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 6f  schema cookie wo
4ff0: 75 6c 64 20 66 61 69 6c 20 74 6f 20 64 65 74 65  uld fail to dete
5000: 63 74 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  ct.  ** the sche
5010: 6d 61 20 63 68 61 6e 67 65 2e 20 20 44 69 73 61  ma change.  Disa
5020: 73 74 65 72 20 77 6f 75 6c 64 20 66 6f 6c 6c 6f  ster would follo
5030: 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  w..  **.  ** Thi
5040: 73 20 74 68 72 65 61 64 20 69 73 20 63 75 72 72  s thread is curr
5050: 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 6d 75  ently holding mu
5060: 74 65 78 65 73 20 6f 6e 20 61 6c 6c 20 42 74 72  texes on all Btr
5070: 65 65 73 20 28 62 65 63 61 75 73 65 0a 20 20 2a  ees (because.  *
5080: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  * of the sqlite3
5090: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20  BtreeEnterAll() 
50a0: 69 6e 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e  in sqlite3LockAn
50b0: 64 50 72 65 70 61 72 65 28 29 29 20 73 6f 20 69  dPrepare()) so i
50c0: 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
50d0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 6f 74 68  ssible for anoth
50e0: 65 72 20 74 68 72 65 61 64 20 74 6f 20 73 74 61  er thread to sta
50f0: 72 74 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  rt a new schema 
5100: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 68 69 6c  change.  ** whil
5110: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
5120: 73 20 72 75 6e 6e 69 6e 67 2e 20 20 48 65 6e 63  s running.  Henc
5130: 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  e, we do not nee
5140: 64 20 74 6f 20 68 6f 6c 64 20 0a 20 20 2a 2a 20  d to hold .  ** 
5150: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 73 63 68  locks on the sch
5160: 65 6d 61 2c 20 77 65 20 6a 75 73 74 20 6e 65 65  ema, we just nee
5170: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e  d to make sure n
5180: 6f 62 6f 64 79 20 65 6c 73 65 20 69 73 20 0a 20  obody else is . 
5190: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 68 65 6d   ** holding them
51a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
51b0: 20 74 68 61 74 20 73 65 74 74 69 6e 67 20 52 45   that setting RE
51c0: 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 6f  AD_UNCOMMITTED o
51d0: 76 65 72 72 69 64 65 73 20 6d 6f 73 74 20 6c 6f  verrides most lo
51e0: 63 6b 20 64 65 74 65 63 74 69 6f 6e 2c 0a 20 20  ck detection,.  
51f0: 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 20 2a  ** but it does *
5200: 6e 6f 74 2a 20 6f 76 65 72 72 69 64 65 20 73 63  not* override sc
5210: 68 65 6d 61 20 6c 6f 63 6b 20 64 65 74 65 63 74  hema lock detect
5220: 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 61 6c 6c  ion, so this all
5230: 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 77 6f 72 6b   still.  ** work
5240: 73 20 65 76 65 6e 20 69 66 20 52 45 41 44 5f 55  s even if READ_U
5250: 4e 43 4f 4d 4d 49 54 54 45 44 20 69 73 20 73 65  NCOMMITTED is se
5260: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
5270: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
5280: 2b 29 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  +) {.    Btree *
5290: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
52a0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
52b0: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
52c0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
52d0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 29 20 29  oldsMutex(pBt) )
52e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
52f0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c  ite3BtreeSchemaL
5300: 6f 63 6b 65 64 28 70 42 74 29 3b 0a 20 20 20 20  ocked(pBt);.    
5310: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
5320: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5330: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  zDb = db->aDb[i]
5340: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
5350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
5360: 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 22  ithMsg(db, rc, "
5370: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
5380: 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20  is locked: %s", 
5390: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 74 65  zDb);.        te
53a0: 73 74 63 61 73 65 28 20 64 62 2d 3e 66 6c 61 67  stcase( db->flag
53b0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
53c0: 6e 63 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 20  ncommit );.     
53d0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72 65 70     goto end_prep
53e0: 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  are;.      }.   
53f0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
5400: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
5410: 64 62 29 3b 0a 0a 20 20 73 50 61 72 73 65 2e 64  db);..  sParse.d
5420: 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 6e 42  b = db;.  if( nB
5430: 79 74 65 73 3e 3d 30 20 26 26 20 28 6e 42 79 74  ytes>=0 && (nByt
5440: 65 73 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 42  es==0 || zSql[nB
5450: 79 74 65 73 2d 31 5d 21 3d 30 29 20 29 7b 0a 20  ytes-1]!=0) ){. 
5460: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 43 6f 70     char *zSqlCop
5470: 79 3b 0a 20 20 20 20 69 6e 74 20 6d 78 4c 65 6e  y;.    int mxLen
5480: 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   = db->aLimit[SQ
5490: 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
54a0: 45 4e 47 54 48 5d 3b 0a 20 20 20 20 74 65 73 74  ENGTH];.    test
54b0: 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78  case( nBytes==mx
54c0: 4c 65 6e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  Len );.    testc
54d0: 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d 78 4c  ase( nBytes==mxL
54e0: 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  en+1 );.    if( 
54f0: 6e 42 79 74 65 73 3e 6d 78 4c 65 6e 20 29 7b 0a  nBytes>mxLen ){.
5500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5510: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
5520: 4c 49 54 45 5f 54 4f 4f 42 49 47 2c 20 22 73 74  LITE_TOOBIG, "st
5530: 61 74 65 6d 65 6e 74 20 74 6f 6f 20 6c 6f 6e 67  atement too long
5540: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ");.      rc = s
5550: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
5560: 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 29  , SQLITE_TOOBIG)
5570: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
5580: 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20 7d 0a  _prepare;.    }.
5590: 20 20 20 20 7a 53 71 6c 43 6f 70 79 20 3d 20 73      zSqlCopy = s
55a0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
55b0: 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73  db, zSql, nBytes
55c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 43  );.    if( zSqlC
55d0: 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  opy ){.      sql
55e0: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 26 73  ite3RunParser(&s
55f0: 50 61 72 73 65 2c 20 7a 53 71 6c 43 6f 70 79 2c  Parse, zSqlCopy,
5600: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
5610: 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 20 3d    sParse.zTail =
5620: 20 26 7a 53 71 6c 5b 73 50 61 72 73 65 2e 7a 54   &zSql[sParse.zT
5630: 61 69 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b 0a 20  ail-zSqlCopy];. 
5640: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5650: 65 65 28 64 62 2c 20 7a 53 71 6c 43 6f 70 79 29  ee(db, zSqlCopy)
5660: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5670: 20 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 20     sParse.zTail 
5680: 3d 20 26 7a 53 71 6c 5b 6e 42 79 74 65 73 5d 3b  = &zSql[nBytes];
5690: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
56a0: 20 20 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61      sqlite3RunPa
56b0: 72 73 65 72 28 26 73 50 61 72 73 65 2c 20 7a 53  rser(&sParse, zS
56c0: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
56d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d   }.  assert( 0==
56e0: 73 50 61 72 73 65 2e 6e 51 75 65 72 79 4c 6f 6f  sParse.nQueryLoo
56f0: 70 20 29 3b 0a 0a 20 20 69 66 28 20 73 50 61 72  p );..  if( sPar
5700: 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  se.rc==SQLITE_DO
5710: 4e 45 20 29 20 73 50 61 72 73 65 2e 72 63 20 3d  NE ) sParse.rc =
5720: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
5730: 28 20 73 50 61 72 73 65 2e 63 68 65 63 6b 53 63  ( sParse.checkSc
5740: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 63 68 65  hema ){.    sche
5750: 6d 61 49 73 56 61 6c 69 64 28 26 73 50 61 72 73  maIsValid(&sPars
5760: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  e);.  }.  if( db
5770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5780: 7b 0a 20 20 20 20 73 50 61 72 73 65 2e 72 63 20  {.    sParse.rc 
5790: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
57a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
57b0: 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 2a 70 7a  zTail ){.    *pz
57c0: 54 61 69 6c 20 3d 20 73 50 61 72 73 65 2e 7a 54  Tail = sParse.zT
57d0: 61 69 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ail;.  }.  rc = 
57e0: 73 50 61 72 73 65 2e 72 63 3b 0a 0a 23 69 66 6e  sParse.rc;..#ifn
57f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5800: 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 72 63  EXPLAIN.  if( rc
5810: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
5820: 50 61 72 73 65 2e 70 56 64 62 65 20 26 26 20 73  Parse.pVdbe && s
5830: 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 20 29 7b  Parse.explain ){
5840: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
5850: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
5860: 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  zColName[] = {. 
5870: 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
5880: 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
5890: 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
58a0: 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 2c  "p5", "comment",
58b0: 0a 20 20 20 20 20 20 20 22 69 64 22 2c 20 22 70  .       "id", "p
58c0: 61 72 65 6e 74 22 2c 20 22 6e 6f 74 75 73 65 64  arent", "notused
58d0: 22 2c 20 22 64 65 74 61 69 6c 22 0a 20 20 20 20  ", "detail".    
58e0: 7d 3b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73  };.    int iFirs
58f0: 74 2c 20 6d 78 3b 0a 20 20 20 20 69 66 28 20 73  t, mx;.    if( s
5900: 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 3d 3d 32  Parse.explain==2
5910: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5920: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
5930: 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20 34 29  sParse.pVdbe, 4)
5940: 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74 20 3d  ;.      iFirst =
5950: 20 38 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20 31   8;.      mx = 1
5960: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
5970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5980: 65 74 4e 75 6d 43 6f 6c 73 28 73 50 61 72 73 65  etNumCols(sParse
5990: 2e 70 56 64 62 65 2c 20 38 29 3b 0a 20 20 20 20  .pVdbe, 8);.    
59a0: 20 20 69 46 69 72 73 74 20 3d 20 30 3b 0a 20 20    iFirst = 0;.  
59b0: 20 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20 20 20      mx = 8;.    
59c0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 46 69 72  }.    for(i=iFir
59d0: 73 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  st; i<mx; i++){.
59e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
59f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 73 50 61 72  eSetColName(sPar
5a00: 73 65 2e 70 56 64 62 65 2c 20 69 2d 69 46 69 72  se.pVdbe, i-iFir
5a10: 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45  st, COLNAME_NAME
5a20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
5a40: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c 49  ColName[i], SQLI
5a50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
5a60: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
5a70: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5a80: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
5a90: 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 73 50  te3VdbeSetSql(sP
5aa0: 61 72 73 65 2e 70 56 64 62 65 2c 20 7a 53 71 6c  arse.pVdbe, zSql
5ab0: 2c 20 28 69 6e 74 29 28 73 50 61 72 73 65 2e 7a  , (int)(sParse.z
5ac0: 54 61 69 6c 2d 7a 53 71 6c 29 2c 20 70 72 65 70  Tail-zSql), prep
5ad0: 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  Flags);.  }.  if
5ae0: 28 20 73 50 61 72 73 65 2e 70 56 64 62 65 20 26  ( sParse.pVdbe &
5af0: 26 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  & (rc!=SQLITE_OK
5b00: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
5b10: 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  iled) ){.    sql
5b20: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
5b30: 28 73 50 61 72 73 65 2e 70 56 64 62 65 29 3b 0a  (sParse.pVdbe);.
5b40: 20 20 20 20 61 73 73 65 72 74 28 21 28 2a 70 70      assert(!(*pp
5b50: 53 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Stmt));.  }else{
5b60: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  .    *ppStmt = (
5b70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 50  sqlite3_stmt*)sP
5b80: 61 72 73 65 2e 70 56 64 62 65 3b 0a 20 20 7d 0a  arse.pVdbe;.  }.
5b90: 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
5ba0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5bb0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
5bc0: 2c 20 22 25 73 22 2c 20 7a 45 72 72 4d 73 67 29  , "%s", zErrMsg)
5bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
5be0: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
5bf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5c00: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5c10: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  rc);.  }..  /* D
5c20: 65 6c 65 74 65 20 61 6e 79 20 54 72 69 67 67 65  elete any Trigge
5c30: 72 50 72 67 20 73 74 72 75 63 74 75 72 65 73 20  rPrg structures 
5c40: 61 6c 6c 6f 63 61 74 65 64 20 77 68 69 6c 65 20  allocated while 
5c50: 70 61 72 73 69 6e 67 20 74 68 69 73 20 73 74 61  parsing this sta
5c60: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 77 68 69  tement. */.  whi
5c70: 6c 65 28 20 73 50 61 72 73 65 2e 70 54 72 69 67  le( sParse.pTrig
5c80: 67 65 72 50 72 67 20 29 7b 0a 20 20 20 20 54 72  gerPrg ){.    Tr
5c90: 69 67 67 65 72 50 72 67 20 2a 70 54 20 3d 20 73  iggerPrg *pT = s
5ca0: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72  Parse.pTriggerPr
5cb0: 67 3b 0a 20 20 20 20 73 50 61 72 73 65 2e 70 54  g;.    sParse.pT
5cc0: 72 69 67 67 65 72 50 72 67 20 3d 20 70 54 2d 3e  riggerPrg = pT->
5cd0: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
5ce0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 29  e3DbFree(db, pT)
5cf0: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 72 65 70 61  ;.  }..end_prepa
5d00: 72 65 3a 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  re:..  sqlite3Pa
5d10: 72 73 65 72 52 65 73 65 74 28 26 73 50 61 72 73  rserReset(&sPars
5d20: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
5d30: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  .}.static int sq
5d40: 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70  lite3LockAndPrep
5d50: 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
5d60: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
5d70: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
5d80: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
5d90: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
5da0: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
5db0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
5dc0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
5dd0: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
5de0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
5df0: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
5e00: 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67  /.  u32 prepFlag
5e10: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
5e20: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
5e30: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
5e40: 6c 61 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  lags */.  Vdbe *
5e50: 70 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  pOld,           
5e60: 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
5e70: 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20  reprepared */.  
5e80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5e90: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
5ea0: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
5eb0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
5ec0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
5ed0: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
5ee0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
5ef0: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
5f00: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
5f10: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
5f20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5f30: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
5f40: 0a 20 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30  .  if( ppStmt==0
5f50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5f60: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
5f70: 6e 64 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ndif.  *ppStmt =
5f80: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
5f90: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
5fa0: 64 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a  db)||zSql==0 ){.
5fb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5fc0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
5fd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
5fe0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
5ff0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6000: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6010: 0a 20 20 64 6f 7b 0a 20 20 20 20 2f 2a 20 4d 61  .  do{.    /* Ma
6020: 6b 65 20 6d 75 6c 74 69 70 6c 65 20 61 74 74 65  ke multiple atte
6030: 6d 70 74 73 20 74 6f 20 63 6f 6d 70 69 6c 65 20  mpts to compile 
6040: 74 68 65 20 53 51 4c 2c 20 75 6e 74 69 6c 20 69  the SQL, until i
6050: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
6060: 73 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6e 63 6f  s.    ** or enco
6070: 75 6e 74 65 72 73 20 61 20 70 65 72 6d 61 6e 65  unters a permane
6080: 6e 74 20 65 72 72 6f 72 2e 20 20 41 20 73 63 68  nt error.  A sch
6090: 65 6d 61 20 70 72 6f 62 6c 65 6d 20 61 66 74 65  ema problem afte
60a0: 72 20 6f 6e 65 20 73 63 68 65 6d 61 0a 20 20 20  r one schema.   
60b0: 20 2a 2a 20 72 65 73 65 74 20 69 73 20 63 6f 6e   ** reset is con
60c0: 73 69 64 65 72 65 64 20 61 20 70 65 72 6d 61 6e  sidered a perman
60d0: 65 6e 74 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20  ent error. */.  
60e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72    rc = sqlite3Pr
60f0: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
6100: 6e 42 79 74 65 73 2c 20 70 72 65 70 46 6c 61 67  nBytes, prepFlag
6110: 73 2c 20 70 4f 6c 64 2c 20 70 70 53 74 6d 74 2c  s, pOld, ppStmt,
6120: 20 70 7a 54 61 69 6c 29 3b 0a 20 20 20 20 61 73   pzTail);.    as
6130: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
6140: 5f 4f 4b 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d  _OK || *ppStmt==
6150: 30 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  0 );.  }while( r
6160: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  c==SQLITE_ERROR_
6170: 52 45 54 52 59 0a 20 20 20 20 20 20 20 7c 7c 20  RETRY.       || 
6180: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45  (rc==SQLITE_SCHE
6190: 4d 41 20 26 26 20 28 73 71 6c 69 74 65 33 52 65  MA && (sqlite3Re
61a0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c  setOneSchema(db,
61b0: 2d 31 29 2c 20 63 6e 74 2b 2b 29 3d 3d 30 29 20  -1), cnt++)==0) 
61c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
61d0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
61e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
61f0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
6200: 61 73 73 65 72 74 28 20 28 72 63 26 64 62 2d 3e  assert( (rc&db->
6210: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
6220: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6230: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6240: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6250: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6260: 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
6270: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 73 20 69 66  ./*.** Checks if
6280: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
6290: 6f 6b 65 6e 20 69 73 20 61 20 74 61 62 6c 65 2c  oken is a table,
62a0: 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 66 75 6e 63   column, or func
62b0: 74 69 6f 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 62 61  tion name,.** ba
62c0: 73 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  sed on the datab
62d0: 61 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ases associated 
62e0: 77 69 74 68 20 74 68 65 20 73 74 61 74 65 6d 65  with the stateme
62f0: 6e 74 20 62 65 69 6e 67 20 70 72 65 70 61 72 65  nt being prepare
6300: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e  d..** If the fun
6310: 63 74 69 6f 6e 20 66 61 69 6c 73 2c 20 7a 65 72  ction fails, zer
6320: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  o is returned an
6330: 64 20 70 52 63 20 69 73 20 66 69 6c 6c 65 64 20  d pRc is filled 
6340: 77 69 74 68 20 74 68 65 0a 2a 2a 20 65 72 72 6f  with the.** erro
6350: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
6360: 63 20 69 6e 74 20 73 68 6f 75 6c 64 54 72 65 61  c int shouldTrea
6370: 74 41 73 49 64 65 6e 74 69 66 69 65 72 28 0a 20  tAsIdentifier(. 
6380: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6390: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
63a0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f   handle. */.  co
63b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
63c0: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
63d0: 73 74 61 72 74 20 6f 66 20 74 6f 6b 65 6e 20 74  start of token t
63e0: 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
63f0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
6400: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6410: 6f 66 20 74 6f 6b 65 6e 20 74 6f 20 62 65 20 63  of token to be c
6420: 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
6430: 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
6440: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 72  /* Pointer to er
6450: 72 6f 72 20 63 6f 64 65 20 75 70 6f 6e 20 66 61  ror code upon fa
6460: 69 6c 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ilure */.){.  in
6470: 74 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20  t bFound = 0;   
6480: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
6490: 20 74 6f 6b 65 6e 20 69 73 20 61 6e 20 69 64 65   token is an ide
64a0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 2e 20 2a 2f  ntifier name. */
64b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
64c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
64d0: 73 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6c 6f  se and column lo
64e0: 6f 70 20 69 6e 64 65 78 65 73 2e 20 2a 2f 0a 20  op indexes. */. 
64f0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6500: 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 66  ;    /* Schema f
6510: 6f 72 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  or current datab
6520: 61 73 65 2e 20 2a 2f 0a 20 20 48 61 73 68 20 2a  ase. */.  Hash *
6530: 70 48 61 73 68 3b 20 20 20 20 20 20 20 20 2f 2a  pHash;        /*
6540: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 74   Hash table of t
6550: 61 62 6c 65 73 20 66 6f 72 20 63 75 72 72 65 6e  ables for curren
6560: 74 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20  t database. */. 
6570: 20 48 61 73 68 45 6c 65 6d 20 2a 65 3b 20 20 20   HashElem *e;   
6580: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65 6c 65       /* Hash ele
6590: 6d 65 6e 74 20 66 6f 72 20 68 61 73 68 20 74 61  ment for hash ta
65a0: 62 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 2a  ble iteration. *
65b0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
65d0: 61 73 65 20 74 61 62 6c 65 20 66 6f 72 20 63 6f  ase table for co
65e0: 6c 75 6d 6e 73 20 62 65 69 6e 67 20 63 68 65 63  lumns being chec
65f0: 6b 65 64 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  ked. */..  if( s
6600: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 4e 28 7a  qlite3IsRowidN(z
6610: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29  Token, nToken) )
6620: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
6630: 20 20 7d 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e    }.  if( nToken
6640: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  >0 ){.    int ha
6650: 73 68 20 3d 20 53 51 4c 49 54 45 5f 46 55 4e 43  sh = SQLITE_FUNC
6660: 5f 48 41 53 48 28 73 71 6c 69 74 65 33 55 70 70  _HASH(sqlite3Upp
6670: 65 72 54 6f 4c 6f 77 65 72 5b 28 75 38 29 7a 54  erToLower[(u8)zT
6680: 6f 6b 65 6e 5b 30 5d 5d 2c 20 6e 54 6f 6b 65 6e  oken[0]], nToken
6690: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
66a0: 65 33 46 75 6e 63 74 69 6f 6e 53 65 61 72 63 68  e3FunctionSearch
66b0: 4e 28 68 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20  N(hash, zToken, 
66c0: 6e 54 6f 6b 65 6e 29 20 29 20 72 65 74 75 72 6e  nToken) ) return
66d0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
66e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 73 71 6c  ( db!=0 );.  sql
66f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6700: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6710: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6720: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6730: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6740: 2b 2b 29 7b 0a 20 20 20 20 70 48 61 73 68 20 3d  ++){.    pHash =
6750: 20 26 64 62 2d 3e 61 46 75 6e 63 3b 0a 20 20 20   &db->aFunc;.   
6760: 20 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 68   if( sqlite3Hash
6770: 46 69 6e 64 4e 28 70 48 61 73 68 2c 20 7a 54 6f  FindN(pHash, zTo
6780: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 7b 0a  ken, nToken) ){.
6790: 20 20 20 20 20 20 62 46 6f 75 6e 64 20 3d 20 31        bFound = 1
67a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
67b0: 20 20 20 7d 0a 20 20 20 20 70 53 63 68 65 6d 61     }.    pSchema
67c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
67d0: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 70  chema;.    if( p
67e0: 53 63 68 65 6d 61 3d 3d 30 20 29 20 63 6f 6e 74  Schema==0 ) cont
67f0: 69 6e 75 65 3b 0a 20 20 20 20 70 48 61 73 68 20  inue;.    pHash 
6800: 3d 20 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  = &pSchema->tblH
6810: 61 73 68 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ash;.    if( sql
6820: 69 74 65 33 48 61 73 68 46 69 6e 64 4e 28 70 48  ite3HashFindN(pH
6830: 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  ash, zToken, nTo
6840: 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 62 46  ken) ){.      bF
6850: 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
6860: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6870: 20 66 6f 72 28 65 3d 73 71 6c 69 74 65 48 61 73   for(e=sqliteHas
6880: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 65  hFirst(pHash); e
6890: 3b 20 65 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; e=sqliteHashNe
68a0: 78 74 28 65 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(e)){.      pT
68b0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
68c0: 61 74 61 28 65 29 3b 0a 20 20 20 20 20 20 69 66  ata(e);.      if
68d0: 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pTab==0 ) cont
68e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 48 61 73  inue;.      pHas
68f0: 68 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6c 48 61  h = pTab->pColHa
6900: 73 68 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  sh;.      if( pH
6910: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
6920: 20 20 70 54 61 62 2d 3e 70 43 6f 6c 48 61 73 68    pTab->pColHash
6930: 20 3d 20 70 48 61 73 68 20 3d 20 73 71 6c 69 74   = pHash = sqlit
6940: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
6950: 28 48 61 73 68 29 29 3b 0a 20 20 20 20 20 20 20  (Hash));.       
6960: 20 69 66 28 20 70 48 61 73 68 20 29 7b 0a 20 20   if( pHash ){.  
6970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
6980: 61 73 68 49 6e 69 74 28 70 48 61 73 68 29 3b 0a  ashInit(pHash);.
6990: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
69a0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
69b0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
69c0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
69d0: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  = &pTab->aCol[j]
69e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
69f0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
6a00: 70 48 61 73 68 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  pHash, pCol->zNa
6a10: 6d 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 20  me, pCol);.     
6a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6a30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6a40: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
6a50: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
6a60: 20 20 20 20 62 46 6f 75 6e 64 20 3d 20 30 3b 0a      bFound = 0;.
6a70: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
6a80: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  one;.        }. 
6a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6aa0: 20 70 48 61 73 68 20 26 26 20 73 71 6c 69 74 65   pHash && sqlite
6ab0: 33 48 61 73 68 46 69 6e 64 4e 28 70 48 61 73 68  3HashFindN(pHash
6ac0: 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , zToken, nToken
6ad0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 46 6f  ) ){.        bFo
6ae0: 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
6af0: 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20   goto done;.    
6b00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 64 6f    }.    }.  }.do
6b10: 6e 65 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ne:.  sqlite3Btr
6b20: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
6b30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b40: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6b50: 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6f 75 6e  ;.  return bFoun
6b60: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  d;.}../*.** Atte
6b70: 6d 70 74 20 74 6f 20 65 73 74 69 6d 61 74 65 20  mpt to estimate 
6b80: 74 68 65 20 66 69 6e 61 6c 20 6f 75 74 70 75 74  the final output
6b90: 20 62 75 66 66 65 72 20 73 69 7a 65 20 6e 65 65   buffer size nee
6ba0: 64 65 64 20 66 6f 72 20 74 68 65 20 66 75 6c 6c  ded for the full
6bb0: 79 0a 2a 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20  y.** normalized 
6bc0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
6bd0: 70 65 63 69 66 69 65 64 20 53 51 4c 20 73 74 72  pecified SQL str
6be0: 69 6e 67 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ing.  This shoul
6bf0: 64 20 74 61 6b 65 20 69 6e 74 6f 0a 2a 2a 20 61  d take into.** a
6c00: 63 63 6f 75 6e 74 20 61 6e 79 20 70 6f 74 65 6e  ccount any poten
6c10: 74 69 61 6c 20 65 78 70 61 6e 73 69 6f 6e 20 74  tial expansion t
6c20: 68 61 74 20 63 6f 75 6c 64 20 6f 63 63 75 72 20  hat could occur 
6c30: 28 65 2e 67 2e 20 76 69 61 20 49 4e 20 63 6c 61  (e.g. via IN cla
6c40: 75 73 65 73 0a 2a 2a 20 62 65 69 6e 67 20 65 78  uses.** being ex
6c50: 70 61 6e 64 65 64 2c 20 65 74 63 29 2e 20 20 54  panded, etc).  T
6c60: 68 69 73 20 73 69 7a 65 20 72 65 74 75 72 6e 65  his size returne
6c70: 64 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  d is the total n
6c80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
6c90: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
6ca0: 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  NUL terminator..
6cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 73  */.static int es
6cc0: 74 69 6d 61 74 65 4e 6f 72 6d 61 6c 69 7a 65 64  timateNormalized
6cd0: 53 69 7a 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Size(.  const ch
6ce0: 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a 20 54 68 65  ar *zSql, /* The
6cf0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
6d00: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ring */.  int nS
6d10: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ql,         /* L
6d20: 65 6e 67 74 68 20 6f 66 20 6f 72 69 67 69 6e 61  ength of origina
6d30: 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  l SQL string */.
6d40: 20 20 75 38 20 70 72 65 70 46 6c 61 67 73 20 20    u8 prepFlags  
6d50: 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73      /* The flags
6d60: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
6d70: 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 29 20  e3_prepare_v3() 
6d80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f 75 74  */.){.  int nOut
6d90: 20 3d 20 6e 53 71 6c 20 2b 20 34 3b 0a 20 20 63   = nSql + 4;.  c
6da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
6db0: 53 71 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  Sql;.  while( nO
6dc0: 75 74 3c 6e 53 71 6c 2a 35 20 29 7b 0a 20 20 20  ut<nSql*5 ){.   
6dd0: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d 30 20   while( z[0]!=0 
6de0: 26 26 20 7a 5b 30 5d 21 3d 27 49 27 20 26 26 20  && z[0]!='I' && 
6df0: 7a 5b 30 5d 21 3d 27 69 27 20 29 7b 20 7a 2b 2b  z[0]!='i' ){ z++
6e00: 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ; }.    if( z[0]
6e10: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6e20: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b   z++;.    if( z[
6e30: 30 5d 21 3d 27 4e 27 20 26 26 20 7a 5b 30 5d 21  0]!='N' && z[0]!
6e40: 3d 27 6e 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='n' ) break;.  
6e50: 20 20 7a 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65    z++;.    while
6e60: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
6e70: 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d  (z[0]) ){ z++; }
6e80: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
6e90: 28 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  (' ) break;.    
6ea0: 7a 2b 2b 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  z++;.    nOut +=
6eb0: 20 35 3b 20 2f 2a 20 3f 2c 3f 2c 3f 20 2a 2f 0a   5; /* ?,?,? */.
6ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 4f 75    }.  return nOu
6ed0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  t;.}../*.** Copy
6ee0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 6f 6b   the current tok
6ef0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  en into the outp
6f00: 75 74 20 62 75 66 66 65 72 20 77 68 69 6c 65 20  ut buffer while 
6f10: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 71 75 6f  dealing with quo
6f20: 74 65 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ted.** identifie
6f30: 72 73 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  rs.  By default,
6f40: 20 61 6c 6c 20 6c 65 74 74 65 72 73 20 77 69 6c   all letters wil
6f50: 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
6f60: 6e 74 6f 20 6c 6f 77 65 72 63 61 73 65 2e 0a 2a  nto lowercase..*
6f70: 2a 20 49 66 20 74 68 65 20 62 55 70 70 65 72 20  * If the bUpper 
6f80: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 75 70 70  flag is set, upp
6f90: 65 72 63 61 73 65 20 77 69 6c 6c 20 62 65 20 75  ercase will be u
6fa0: 73 65 64 2e 20 20 54 68 65 20 70 69 4f 75 74 20  sed.  The piOut 
6fb0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 77 69 6c 6c  argument.** will
6fc0: 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64 61   be used to upda
6fd0: 74 65 20 74 68 65 20 74 61 72 67 65 74 20 69 6e  te the target in
6fe0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  dex into the out
6ff0: 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  put string..*/.s
7000: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e  tatic void copyN
7010: 6f 72 6d 61 6c 69 7a 65 64 54 6f 6b 65 6e 28 0a  ormalizedToken(.
7020: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7030: 71 6c 2c 20 2f 2a 20 54 68 65 20 6f 72 69 67 69  ql, /* The origi
7040: 6e 61 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a  nal SQL string *
7050: 2f 0a 20 20 69 6e 74 20 69 49 6e 2c 20 20 20 20  /.  int iIn,    
7060: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7070: 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
7080: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 72  original SQL str
7090: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ing */.  int nTo
70a0: 6b 65 6e 2c 20 20 20 20 20 20 20 2f 2a 20 4e 75  ken,       /* Nu
70b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
70c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 6f 6b   the current tok
70d0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  en */.  int toke
70e0: 6e 46 6c 61 67 73 2c 20 20 20 2f 2a 20 46 6c 61  nFlags,   /* Fla
70f0: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  gs returned by t
7100: 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f 0a  he tokenizer */.
7110: 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20    char *zOut,   
7120: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
7130: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  t string */.  in
7140: 74 20 2a 70 69 4f 75 74 20 20 20 20 20 20 20 20  t *piOut        
7150: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 61  /* Pointer to ta
7160: 72 67 65 74 20 69 6e 64 65 78 20 69 6e 74 6f 20  rget index into 
7170: 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e  the output strin
7180: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 51  g */.){.  int bQ
7190: 75 6f 74 65 64 20 3d 20 74 6f 6b 65 6e 46 6c 61  uoted = tokenFla
71a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 54 4f 4b 45  gs & SQLITE_TOKE
71b0: 4e 5f 51 55 4f 54 45 44 3b 0a 20 20 69 6e 74 20  N_QUOTED;.  int 
71c0: 62 4b 65 79 77 6f 72 64 20 3d 20 74 6f 6b 65 6e  bKeyword = token
71d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54  Flags & SQLITE_T
71e0: 4f 4b 45 4e 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  OKEN_KEYWORD;.  
71f0: 69 6e 74 20 6a 20 3d 20 2a 70 69 4f 75 74 2c 20  int j = *piOut, 
7200: 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 20 6b  k = 0;.  for(; k
7210: 3c 6e 54 6f 6b 65 6e 3b 20 6b 2b 2b 29 7b 0a 20  <nToken; k++){. 
7220: 20 20 20 69 66 28 20 62 51 75 6f 74 65 64 20 29     if( bQuoted )
7230: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  {.      if( k==0
7240: 20 26 26 20 69 49 6e 3e 30 20 29 7b 0a 20 20 20   && iIn>0 ){.   
7250: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
7260: 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 63 6f   '"';.        co
7270: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
7280: 6c 73 65 20 69 66 28 20 6b 3d 3d 6e 54 6f 6b 65  lse if( k==nToke
7290: 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  n-1 ){.        z
72a0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 27 22 27 3b 0a  Out[j++] = '"';.
72b0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
72c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
72d0: 20 20 20 20 69 66 28 20 62 4b 65 79 77 6f 72 64      if( bKeyword
72e0: 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a   ){.      zOut[j
72f0: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 75  ++] = sqlite3Tou
7300: 70 70 65 72 28 7a 53 71 6c 5b 69 49 6e 2b 6b 5d  pper(zSql[iIn+k]
7310: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7320: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
7330: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a  sqlite3Tolower(z
7340: 53 71 6c 5b 69 49 6e 2b 6b 5d 29 3b 0a 20 20 20  Sql[iIn+k]);.   
7350: 20 7d 0a 20 20 7d 0a 20 20 2a 70 69 4f 75 74 20   }.  }.  *piOut 
7360: 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 65  = j;.}../*.** Pe
7370: 72 66 6f 72 6d 20 6e 6f 72 6d 61 6c 69 7a 61 74  rform normalizat
7380: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 20 63  ion of the SQL c
7390: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
73a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
73b0: 6e 74 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  nt and.** store 
73c0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68  the result in th
73d0: 65 20 7a 4e 6f 72 6d 53 71 6c 20 66 69 65 6c 64  e zNormSql field
73e0: 2e 20 20 54 68 65 20 73 63 68 65 6d 61 20 66 6f  .  The schema fo
73f0: 72 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  r the associated
7400: 0a 2a 2a 20 64 61 74 61 62 61 73 65 73 20 61 72  .** databases ar
7410: 65 20 63 6f 6e 73 75 6c 74 65 64 20 77 68 69 6c  e consulted whil
7420: 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 74 68 65  e performing the
7430: 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 69   normalization i
7440: 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 64 65  n order to.** de
7450: 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 6f 6b  termine if a tok
7460: 65 6e 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  en appears to be
7470: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 20   an identifier. 
7480: 20 41 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   All identifiers
7490: 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20 69 6e 74   are.** left int
74a0: 61 63 74 20 69 6e 20 74 68 65 20 6e 6f 72 6d 61  act in the norma
74b0: 6c 69 7a 65 64 20 53 51 4c 20 61 6e 64 20 61 6c  lized SQL and al
74c0: 6c 20 6c 69 74 65 72 61 6c 73 20 61 72 65 20 72  l literals are r
74d0: 65 70 6c 61 63 65 64 20 77 69 74 68 20 61 0a 2a  eplaced with a.*
74e0: 2a 20 73 69 6e 67 6c 65 20 27 3f 27 2e 0a 2a 2f  * single '?'..*/
74f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 6f 72  .void sqlite3Nor
7500: 6d 61 6c 69 7a 65 28 0a 20 20 56 64 62 65 20 2a  malize(.  Vdbe *
7510: 70 56 64 62 65 2c 20 20 20 20 20 20 2f 2a 20 56  pVdbe,      /* V
7520: 4d 20 62 65 69 6e 67 20 72 65 70 72 65 70 61 72  M being reprepar
7530: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7540: 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a 20 54 68 65  ar *zSql, /* The
7550: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
7560: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ring */.  int nS
7570: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ql,         /* S
7580: 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ize of the input
7590: 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73   string in bytes
75a0: 20 2a 2f 0a 20 20 75 38 20 70 72 65 70 46 6c 61   */.  u8 prepFla
75b0: 67 73 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  gs      /* The f
75c0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
75d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
75e0: 33 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  3() */.){.  sqli
75f0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
7600: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
7610: 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 68 61 72  andle. */.  char
7620: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
7630: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
7640: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
7650: 20 6e 5a 3b 20 20 20 20 20 20 20 20 20 20 20 20   nZ;            
7660: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
7670: 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  he output string
7680: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7690: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
76a0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 68        /* Next ch
76b0: 61 72 61 63 74 65 72 20 74 6f 20 72 65 61 64 20  aracter to read 
76c0: 66 72 6f 6d 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  from zSql[] */. 
76d0: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
76e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
76f0: 63 68 61 72 61 63 74 65 72 20 74 6f 20 66 69 6c  character to fil
7700: 6c 20 69 6e 20 6f 6e 20 7a 5b 5d 20 2a 2f 0a 20  l in on z[] */. 
7710: 20 69 6e 74 20 74 6f 6b 65 6e 54 79 70 65 20 3d   int tokenType =
7720: 20 30 3b 20 20 20 20 20 2f 2a 20 54 79 70 65 20   0;     /* Type 
7730: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65  of the next toke
7740: 6e 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 76 54  n */.  int prevT
7750: 6f 6b 65 6e 54 79 70 65 20 3d 20 30 3b 20 2f 2a  okenType = 0; /*
7760: 20 54 79 70 65 20 6f 66 20 74 68 65 20 70 72 65   Type of the pre
7770: 76 69 6f 75 73 20 74 6f 6b 65 6e 2c 20 65 78 63  vious token, exc
7780: 65 70 74 20 73 70 61 63 65 73 20 2a 2f 0a 20 20  ept spaces */.  
7790: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
77a0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
77b0: 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e  f the next token
77c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 65 6e   */.  int nParen
77d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
77e0: 4e 65 73 74 69 6e 67 20 6c 65 76 65 6c 20 6f 66  Nesting level of
77f0: 20 70 61 72 65 6e 74 68 65 73 69 73 20 2a 2f 0a   parenthesis */.
7800: 20 20 48 61 73 68 20 69 6e 48 61 73 68 3b 20 20    Hash inHash;  
7810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7820: 65 20 6f 66 20 70 61 72 65 6e 74 68 65 73 69 73  e of parenthesis
7830: 20 6c 65 76 65 6c 73 20 74 6f 20 6f 75 74 70 75   levels to outpu
7840: 74 20 69 6e 64 65 78 2e 20 2a 2f 0a 0a 20 20 64  t index. */..  d
7850: 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 44  b = sqlite3VdbeD
7860: 62 28 70 56 64 62 65 29 3b 0a 20 20 61 73 73 65  b(pVdbe);.  asse
7870: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
7880: 73 73 65 72 74 28 20 70 56 64 62 65 2d 3e 7a 4e  ssert( pVdbe->zN
7890: 6f 72 6d 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 69  ormSql==0 );.  i
78a0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
78b0: 75 72 6e 3b 0a 20 20 6e 5a 20 3d 20 65 73 74 69  urn;.  nZ = esti
78c0: 6d 61 74 65 4e 6f 72 6d 61 6c 69 7a 65 64 53 69  mateNormalizedSi
78d0: 7a 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 2c 20 70  ze(zSql, nSql, p
78e0: 72 65 70 46 6c 61 67 73 29 3b 0a 20 20 7a 20 3d  repFlags);.  z =
78f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7900: 52 61 77 4e 4e 28 64 62 2c 20 6e 5a 29 3b 0a 20  RawNN(db, nZ);. 
7910: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
7920: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73  rn;.  sqlite3Has
7930: 68 49 6e 69 74 28 26 69 6e 48 61 73 68 29 3b 0a  hInit(&inHash);.
7940: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
7950: 53 71 6c 20 26 26 20 7a 53 71 6c 5b 69 5d 3b 20  Sql && zSql[i]; 
7960: 69 2b 3d 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66  i+=n){.    int f
7970: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  lags = 0;.    if
7980: 28 20 74 6f 6b 65 6e 54 79 70 65 21 3d 54 4b 5f  ( tokenType!=TK_
7990: 53 50 41 43 45 20 29 20 70 72 65 76 54 6f 6b 65  SPACE ) prevToke
79a0: 6e 54 79 70 65 20 3d 20 74 6f 6b 65 6e 54 79 70  nType = tokenTyp
79b0: 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  e;.    n = sqlit
79c0: 65 33 47 65 74 54 6f 6b 65 6e 4e 6f 72 6d 61 6c  e3GetTokenNormal
79d0: 69 7a 65 64 28 28 75 6e 73 69 67 6e 65 64 20 63  ized((unsigned c
79e0: 68 61 72 2a 29 7a 53 71 6c 2b 69 2c 20 26 74 6f  har*)zSql+i, &to
79f0: 6b 65 6e 54 79 70 65 2c 20 26 66 6c 61 67 73 29  kenType, &flags)
7a00: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 6f  ;.    switch( to
7a10: 6b 65 6e 54 79 70 65 20 29 7b 0a 20 20 20 20 20  kenType ){.     
7a20: 20 63 61 73 65 20 54 4b 5f 53 50 41 43 45 3a 20   case TK_SPACE: 
7a30: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
7a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
7a50: 61 73 65 20 54 4b 5f 49 4c 4c 45 47 41 4c 3a 20  ase TK_ILLEGAL: 
7a60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7a70: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
7a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
7a90: 61 73 68 43 6c 65 61 72 28 26 69 6e 48 61 73 68  ashClear(&inHash
7aa0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
7ab0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
7ac0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
7ad0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
7ae0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 63 61  NTEGER:.      ca
7af0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
7b00: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
7b10: 42 4c 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20  BLE:.      case 
7b20: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
7b30: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b     z[j++] = '?';
7b40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7b60: 73 65 20 54 4b 5f 4c 50 3a 0a 20 20 20 20 20 20  se TK_LP:.      
7b70: 63 61 73 65 20 54 4b 5f 52 50 3a 20 7b 0a 20 20  case TK_RP: {.  
7b80: 20 20 20 20 20 20 69 66 28 20 74 6f 6b 65 6e 54        if( tokenT
7b90: 79 70 65 3d 3d 54 4b 5f 4c 50 20 29 7b 0a 20 20  ype==TK_LP ){.  
7ba0: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b          nParen++
7bb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7bc0: 70 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d 3d 54  prevTokenType==T
7bd0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  K_IN ){.        
7be0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 72      assert( nPar
7bf0: 65 6e 3c 6e 53 71 6c 20 29 3b 0a 20 20 20 20 20  en<nSql );.     
7c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
7c10: 73 68 49 6e 73 65 72 74 28 26 69 6e 48 61 73 68  shInsert(&inHash
7c20: 2c 20 7a 53 71 6c 2b 6e 50 61 72 65 6e 2c 20 53  , zSql+nParen, S
7c30: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
7c40: 28 6a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (j));.          
7c50: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
7c60: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
7c70: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  j;.          ass
7c80: 65 72 74 28 20 6e 50 61 72 65 6e 3c 6e 53 71 6c  ert( nParen<nSql
7c90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6a   );.          jj
7ca0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
7cb0: 5f 49 4e 54 28 73 71 6c 69 74 65 33 48 61 73 68  _INT(sqlite3Hash
7cc0: 46 69 6e 64 28 26 69 6e 48 61 73 68 2c 20 7a 53  Find(&inHash, zS
7cd0: 71 6c 2b 6e 50 61 72 65 6e 29 29 3b 0a 20 20 20  ql+nParen));.   
7ce0: 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 30 20         if( jj>0 
7cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
7d00: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
7d10: 28 26 69 6e 48 61 73 68 2c 20 7a 53 71 6c 2b 6e  (&inHash, zSql+n
7d20: 50 61 72 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Paren, 0);.     
7d30: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
7d40: 6a 2b 36 3c 6e 5a 20 29 3b 0a 20 20 20 20 20 20  j+6<nZ );.      
7d50: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2b 6a        memcpy(z+j
7d60: 6a 2b 31 2c 20 22 3f 2c 3f 2c 3f 22 2c 20 35 29  j+1, "?,?,?", 5)
7d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20  ;.            j 
7d80: 3d 20 6a 6a 2b 36 3b 0a 20 20 20 20 20 20 20 20  = jj+6;.        
7d90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 2d 31      assert( nZ-1
7da0: 2d 6a 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  -j>=0 );.       
7db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 2d       assert( nZ-
7dc0: 31 2d 6a 3c 6e 5a 20 29 3b 0a 20 20 20 20 20 20  1-j<nZ );.      
7dd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 2b 6a        memset(z+j
7de0: 2c 20 30 2c 20 6e 5a 2d 31 2d 6a 29 3b 0a 20 20  , 0, nZ-1-j);.  
7df0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e00: 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20      nParen--;.  
7e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7e20: 61 73 73 65 72 74 28 20 6e 50 61 72 65 6e 3e 3d  assert( nParen>=
7e30: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
7e40: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
7e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7e60: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
7e70: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4d 49 3a     case TK_SEMI:
7e80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 50  .      case TK_P
7e90: 4c 55 53 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LUS:.      case 
7ea0: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 20 20 63  TK_STAR:.      c
7eb0: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
7ec0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
7ed0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45  .      case TK_E
7ee0: 51 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  Q:.      case TK
7ef0: 5f 4c 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20  _LE:.      case 
7f00: 54 4b 5f 4e 45 3a 0a 20 20 20 20 20 20 63 61 73  TK_NE:.      cas
7f10: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
7f20: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
7f30: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48       case TK_RSH
7f40: 49 46 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  IFT:.      case 
7f50: 54 4b 5f 47 54 3a 0a 20 20 20 20 20 20 63 61 73  TK_GT:.      cas
7f60: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 63  e TK_GE:.      c
7f70: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
7f80: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
7f90: 41 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  AT:.      case T
7fa0: 4b 5f 43 4f 4d 4d 41 3a 0a 20 20 20 20 20 20 63  K_COMMA:.      c
7fb0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
7fc0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54       case TK_BIT
7fd0: 4e 4f 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NOT:.      case 
7fe0: 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 20 20 63 61  TK_DOT:.      ca
7ff0: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
8000: 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
8010: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
8020: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c       case TK_NUL
8030: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  L:.      case TK
8040: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  _ID: {.        i
8050: 66 28 20 74 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b  f( tokenType==TK
8060: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  _NULL ){.       
8070: 20 20 20 69 66 28 20 70 72 65 76 54 6f 6b 65 6e     if( prevToken
8080: 54 79 70 65 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  Type==TK_IS || p
8090: 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b  revTokenType==TK
80a0: 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _NOT ){.        
80b0: 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 69 73 20 61      /* NULL is a
80c0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 69 73   keyword in this
80d0: 20 63 61 73 65 2c 20 6e 6f 74 20 61 20 6c 69 74   case, not a lit
80e0: 65 72 61 6c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  eral value */.  
80f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
8110: 72 65 20 74 68 65 20 4e 55 4c 4c 20 69 73 20 61  re the NULL is a
8120: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20 2a   literal value *
8130: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b  /.            z[
8140: 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
8150: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8160: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8180: 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49   j>0 && sqlite3I
8190: 73 49 64 43 68 61 72 28 7a 5b 6a 2d 31 5d 29 20  sIdChar(z[j-1]) 
81a0: 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43 68  && sqlite3IsIdCh
81b0: 61 72 28 7a 53 71 6c 5b 69 5d 29 20 29 7b 0a 20  ar(zSql[i]) ){. 
81c0: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
81d0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
81e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 6b  .        if( tok
81f0: 65 6e 54 79 70 65 3d 3d 54 4b 5f 49 44 20 29 7b  enType==TK_ID ){
8200: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
8210: 32 20 3d 20 69 2c 20 6e 32 20 3d 20 6e 2c 20 72  2 = i, n2 = n, r
8220: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8230: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61           if( nPa
8240: 72 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ren>0 ){.       
8250: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61       assert( nPa
8260: 72 65 6e 3c 6e 53 71 6c 20 29 3b 0a 20 20 20 20  ren<nSql );.    
8270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
8280: 61 73 68 49 6e 73 65 72 74 28 26 69 6e 48 61 73  ashInsert(&inHas
8290: 68 2c 20 7a 53 71 6c 2b 6e 50 61 72 65 6e 2c 20  h, zSql+nParen, 
82a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
82b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c            if( fl
82c0: 61 67 73 26 53 51 4c 49 54 45 5f 54 4f 4b 45 4e  ags&SQLITE_TOKEN
82d0: 5f 51 55 4f 54 45 44 20 29 7b 20 69 32 2b 2b 3b  _QUOTED ){ i2++;
82e0: 20 6e 32 2d 3d 32 3b 20 7d 0a 20 20 20 20 20 20   n2-=2; }.      
82f0: 20 20 20 20 69 66 28 20 73 68 6f 75 6c 64 54 72      if( shouldTr
8300: 65 61 74 41 73 49 64 65 6e 74 69 66 69 65 72 28  eatAsIdentifier(
8310: 64 62 2c 20 7a 53 71 6c 2b 69 32 2c 20 6e 32 2c  db, zSql+i2, n2,
8320: 20 26 72 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20   &rc)==0 ){.    
8330: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
8340: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8350: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8360: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
8370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8380: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
8390: 26 69 6e 48 61 73 68 29 3b 0a 20 20 20 20 20 20  &inHash);.      
83a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
83c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
83d0: 6c 69 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68  lite3_keyword_ch
83e0: 65 63 6b 28 7a 53 71 6c 2b 69 32 2c 20 6e 32 29  eck(zSql+i2, n2)
83f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8400: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f       z[j++] = '?
8410: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ';.             
8420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8440: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8450: 20 20 20 20 63 6f 70 79 4e 6f 72 6d 61 6c 69 7a      copyNormaliz
8460: 65 64 54 6f 6b 65 6e 28 7a 53 71 6c 2c 20 69 2c  edToken(zSql, i,
8470: 20 6e 2c 20 66 6c 61 67 73 2c 20 7a 2c 20 26 6a   n, flags, z, &j
8480: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
8490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
84a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3c    }.  assert( j<
84b0: 6e 5a 20 26 26 20 22 6f 6e 65 22 20 29 3b 0a 20  nZ && "one" );. 
84c0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
84d0: 5b 6a 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6a 2d  [j-1]==' ' ){ j-
84e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6a 3e 30 20 26  -; }.  if( j>0 &
84f0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 3b 27 20 29 7b  & z[j-1]!=';' ){
8500: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3b 27 3b 20 7d   z[j++] = ';'; }
8510: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61  .  z[j] = 0;.  a
8520: 73 73 65 72 74 28 20 6a 3c 6e 5a 20 26 26 20 22  ssert( j<nZ && "
8530: 74 77 6f 22 20 29 3b 0a 20 20 70 56 64 62 65 2d  two" );.  pVdbe-
8540: 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 7a 3b 0a 20  >zNormSql = z;. 
8550: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
8560: 72 28 26 69 6e 48 61 73 68 29 3b 0a 7d 0a 23 65  r(&inHash);.}.#e
8570: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
8580: 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 20  NABLE_NORMALIZE 
8590: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 72 75 6e 20  */../*.** Rerun 
85a0: 74 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  the compilation 
85b0: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 61  of a statement a
85c0: 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63 68  fter a schema ch
85d0: 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ange..**.** If t
85e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
85f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 63  successfully rec
8600: 6f 6d 70 69 6c 65 64 2c 20 72 65 74 75 72 6e 20  ompiled, return 
8610: 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
8620: 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  wise,.** if the 
8630: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
8640: 20 62 65 20 72 65 63 6f 6d 70 69 6c 65 64 20 62   be recompiled b
8650: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20 63  ecause another c
8660: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 2a 2a  onnection has.**
8670: 20 6c 6f 63 6b 65 64 20 74 68 65 20 73 71 6c 69   locked the sqli
8680: 74 65 33 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  te3_master table
8690: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
86a0: 4c 4f 43 4b 45 44 2e 20 49 66 20 61 6e 79 20 6f  LOCKED. If any o
86b0: 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  ther error.** oc
86c0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  curs, return SQL
86d0: 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a 2f 0a 69  ITE_SCHEMA..*/.i
86e0: 6e 74 20 73 71 6c 69 74 65 33 52 65 70 72 65 70  nt sqlite3Reprep
86f0: 61 72 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  are(Vdbe *p){.  
8700: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
8710: 33 5f 73 74 6d 74 20 2a 70 4e 65 77 3b 0a 20 20  3_stmt *pNew;.  
8720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
8730: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8740: 0a 20 20 75 38 20 70 72 65 70 46 6c 61 67 73 3b  .  u8 prepFlags;
8750: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8760: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
8770: 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 2d  qlite3VdbeDb(p)-
8780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 7a 53 71  >mutex) );.  zSq
8790: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
87a0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29  (sqlite3_stmt *)
87b0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53  p);.  assert( zS
87c0: 71 6c 21 3d 30 20 29 3b 20 20 2f 2a 20 52 65 70  ql!=0 );  /* Rep
87d0: 72 65 70 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  repare only call
87e0: 65 64 20 66 6f 72 20 70 72 65 70 61 72 65 5f 76  ed for prepare_v
87f0: 32 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  2() statements *
8800: 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  /.  db = sqlite3
8810: 56 64 62 65 44 62 28 70 29 3b 0a 20 20 61 73 73  VdbeDb(p);.  ass
8820: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8830: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
8840: 78 29 20 29 3b 0a 20 20 70 72 65 70 46 6c 61 67  x) );.  prepFlag
8850: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 50  s = sqlite3VdbeP
8860: 72 65 70 61 72 65 46 6c 61 67 73 28 70 29 3b 0a  repareFlags(p);.
8870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
8880: 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c  ckAndPrepare(db,
8890: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 72 65 70 46   zSql, -1, prepF
88a0: 6c 61 67 73 2c 20 70 2c 20 26 70 4e 65 77 2c 20  lags, p, &pNew, 
88b0: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
88c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
88d0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
88e0: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
88f0: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t(db);.    }.   
8900: 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30   assert( pNew==0
8910: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   );.    return r
8920: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
8930: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
8940: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8950: 56 64 62 65 53 77 61 70 28 28 56 64 62 65 2a 29  VdbeSwap((Vdbe*)
8960: 70 4e 65 77 2c 20 70 29 3b 0a 20 20 73 71 6c 69  pNew, p);.  sqli
8970: 74 65 33 54 72 61 6e 73 66 65 72 42 69 6e 64 69  te3TransferBindi
8980: 6e 67 73 28 70 4e 65 77 2c 20 28 73 71 6c 69 74  ngs(pNew, (sqlit
8990: 65 33 5f 73 74 6d 74 2a 29 70 29 3b 0a 20 20 73  e3_stmt*)p);.  s
89a0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
89b0: 74 65 70 52 65 73 75 6c 74 28 28 56 64 62 65 2a  tepResult((Vdbe*
89c0: 29 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65  )pNew);.  sqlite
89d0: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 28 56  3VdbeFinalize((V
89e0: 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20 72 65  dbe*)pNew);.  re
89f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8a00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 65  }.../*.** Two ve
8a10: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 6f 66  rsions of the of
8a20: 66 69 63 69 61 6c 20 41 50 49 2e 20 20 4c 65 67  ficial API.  Leg
8a30: 61 63 79 20 61 6e 64 20 6e 65 77 20 75 73 65 2e  acy and new use.
8a40: 20 20 49 6e 20 74 68 65 20 6c 65 67 61 63 79 0a    In the legacy.
8a50: 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ** version, the 
8a60: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
8a70: 74 20 69 73 20 6e 6f 74 20 73 61 76 65 64 20 69  t is not saved i
8a80: 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
8a90: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20  tatement.** and 
8aa0: 73 6f 20 69 66 20 61 20 73 63 68 65 6d 61 20 63  so if a schema c
8ab0: 68 61 6e 67 65 20 6f 63 63 75 72 73 2c 20 53 51  hange occurs, SQ
8ac0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 73 20 72  LITE_SCHEMA is r
8ad0: 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 73 71  eturned by.** sq
8ae0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 49  lite3_step().  I
8af0: 6e 20 74 68 65 20 6e 65 77 20 76 65 72 73 69 6f  n the new versio
8b00: 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  n, the original 
8b10: 53 51 4c 20 74 65 78 74 20 69 73 20 72 65 74 61  SQL text is reta
8b20: 69 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ined.** and the 
8b30: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 75 74  statement is aut
8b40: 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65 63 6f 6d  omatically recom
8b50: 70 69 6c 65 64 20 69 66 20 61 6e 20 73 63 68 65  piled if an sche
8b60: 6d 61 20 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63  ma change.** occ
8b70: 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
8b80: 74 65 33 5f 70 72 65 70 61 72 65 28 0a 20 20 73  te3_prepare(.  s
8b90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
8ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8bb0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a  base handle. */.
8bc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
8bd0: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ql,         /* U
8be0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c  TF-8 encoded SQL
8bf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
8c00: 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20   int nBytes,    
8c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
8c20: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20  ngth of zSql in 
8c30: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  bytes. */.  sqli
8c40: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
8c50: 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20  t,    /* OUT: A 
8c60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
8c70: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8c80: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
8c90: 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20  r **pzTail      
8ca0: 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20   /* OUT: End of 
8cb0: 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f  parsed string */
8cc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
8cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b  rc = sqlite3Lock
8ce0: 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53  AndPrepare(db,zS
8cf0: 71 6c 2c 6e 42 79 74 65 73 2c 30 2c 30 2c 70 70  ql,nBytes,0,0,pp
8d00: 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20  Stmt,pzTail);.  
8d10: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8d20: 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d  TE_OK || ppStmt=
8d30: 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30  =0 || *ppStmt==0
8d40: 20 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20   );  /* VERIFY: 
8d50: 46 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75  F13021 */.  retu
8d60: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
8d70: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
8d80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8da0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
8db0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8dc0: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
8dd0: 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  /* UTF-8 encoded
8de0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
8df0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e10: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
8e20: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
8e30: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
8e40: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
8e50: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
8e60: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
8e70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
8e80: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
8e90: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
8ea0: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
8eb0: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
8ec0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
8ed0: 4f 46 3a 20 52 2d 33 37 39 32 33 2d 31 32 31 37  OF: R-37923-1217
8ee0: 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 72  3 The sqlite3_pr
8ef0: 65 70 61 72 65 5f 76 32 28 29 20 69 6e 74 65 72  epare_v2() inter
8f00: 66 61 63 65 20 77 6f 72 6b 73 0a 20 20 2a 2a 20  face works.  ** 
8f10: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
8f20: 20 61 73 20 73 71 6c 69 74 65 33 5f 70 72 65 70   as sqlite3_prep
8f30: 61 72 65 5f 76 33 28 29 20 77 69 74 68 20 61 20  are_v3() with a 
8f40: 7a 65 72 6f 20 70 72 65 70 46 6c 61 67 73 0a 20  zero prepFlags. 
8f50: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 20   ** parameter.. 
8f60: 20 2a 2a 0a 20 20 2a 2a 20 50 72 6f 6f 66 20 69   **.  ** Proof i
8f70: 6e 20 74 68 61 74 20 74 68 65 20 35 74 68 20 70  n that the 5th p
8f80: 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69  arameter to sqli
8f90: 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72  te3LockAndPrepar
8fa0: 65 20 69 73 20 30 20 2a 2f 0a 20 20 72 63 20 3d  e is 0 */.  rc =
8fb0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50   sqlite3LockAndP
8fc0: 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e  repare(db,zSql,n
8fd0: 42 79 74 65 73 2c 53 51 4c 49 54 45 5f 50 52 45  Bytes,SQLITE_PRE
8fe0: 50 41 52 45 5f 53 41 56 45 53 51 4c 2c 30 2c 0a  PARE_SAVESQL,0,.
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70 53               ppS
9010: 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61  tmt,pzTail);.  a
9020: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
9030: 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d  E_OK || ppStmt==
9040: 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  0 || *ppStmt==0 
9050: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9060: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72  }.int sqlite3_pr
9070: 65 70 61 72 65 5f 76 33 28 0a 20 20 73 71 6c 69  epare_v3(.  sqli
9080: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9090: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
90a0: 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63  e handle. */.  c
90b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
90c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
90d0: 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  8 encoded SQL st
90e0: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
90f0: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
9100: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9110: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
9120: 65 73 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  es. */.  unsigne
9130: 64 20 69 6e 74 20 70 72 65 70 46 6c 61 67 73 2c  d int prepFlags,
9140: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
9150: 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  re SQLITE_PREPAR
9160: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  E_* flags */.  s
9170: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
9180: 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt,    /* OUT:
9190: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
91a0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
91b0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
91c0: 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20  char **pzTail   
91d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20      /* OUT: End 
91e0: 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67  of parsed string
91f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
9200: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
9210: 46 3a 20 52 2d 35 36 38 36 31 2d 34 32 36 37 33  F: R-56861-42673
9220: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
9230: 5f 76 33 28 29 20 64 69 66 66 65 72 73 20 66 72  _v3() differs fr
9240: 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  om.  ** sqlite3_
9250: 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f 6e 6c  prepare_v2() onl
9260: 79 20 69 6e 20 68 61 76 69 6e 67 20 74 68 65 20  y in having the 
9270: 65 78 74 72 61 20 70 72 65 70 46 6c 61 67 73 20  extra prepFlags 
9280: 70 61 72 61 6d 65 74 65 72 2c 0a 20 20 2a 2a 20  parameter,.  ** 
9290: 77 68 69 63 68 20 69 73 20 61 20 62 69 74 20 61  which is a bit a
92a0: 72 72 61 79 20 63 6f 6e 73 69 73 74 69 6e 67 20  rray consisting 
92b0: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
92c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  of the.  ** SQLI
92d0: 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61  TE_PREPARE_* fla
92e0: 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72  gs..  **.  ** Pr
92f0: 6f 6f 66 20 62 79 20 63 6f 6d 70 61 72 69 73 6f  oof by compariso
9300: 6e 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  n to the impleme
9310: 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
9320: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 0a  e3_prepare_v2().
9330: 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 62    ** directly ab
9340: 6f 76 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ove. */.  rc = s
9350: 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65  qlite3LockAndPre
9360: 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79  pare(db,zSql,nBy
9370: 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
9380: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45        SQLITE_PRE
9390: 50 41 52 45 5f 53 41 56 45 53 51 4c 7c 28 70 72  PARE_SAVESQL|(pr
93a0: 65 70 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 50  epFlags&SQLITE_P
93b0: 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c 0a 20 20  REPARE_MASK),.  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
93d0: 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b  ,ppStmt,pzTail);
93e0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
93f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74  QLITE_OK || ppSt
9400: 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74  mt==0 || *ppStmt
9410: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
9420: 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
9430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
9440: 36 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  6./*.** Compile 
9450: 74 68 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  the UTF-16 encod
9460: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
9470: 20 7a 53 71 6c 20 69 6e 74 6f 20 61 20 73 74 61   zSql into a sta
9480: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
9490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
94a0: 69 74 65 33 50 72 65 70 61 72 65 31 36 28 0a 20  ite3Prepare16(. 
94b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
94c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
94d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
94e0: 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  / .  const void 
94f0: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f  *zSql,         /
9500: 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  * UTF-16 encoded
9510: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
9520: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9540: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
9550: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
9560: 75 33 32 20 70 72 65 70 46 6c 61 67 73 2c 20 20  u32 prepFlags,  
9570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
9580: 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45  o or more SQLITE
9590: 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73  _PREPARE_* flags
95a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
95b0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
95c0: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
95d0: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
95e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
95f0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a   const void **pz
9600: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
9610: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
9620: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
9630: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
9640: 20 63 75 72 72 65 6e 74 6c 79 20 77 6f 72 6b 73   currently works
9650: 20 62 79 20 66 69 72 73 74 20 74 72 61 6e 73 66   by first transf
9660: 6f 72 6d 69 6e 67 20 74 68 65 20 55 54 46 2d 31  orming the UTF-1
9670: 36 0a 20 20 2a 2a 20 65 6e 63 6f 64 65 64 20 73  6.  ** encoded s
9680: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2c 20  tring to UTF-8, 
9690: 74 68 65 6e 20 69 6e 76 6f 6b 69 6e 67 20 73 71  then invoking sq
96a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e  lite3_prepare().
96b0: 20 54 68 65 0a 20 20 2a 2a 20 74 72 69 63 6b 79   The.  ** tricky
96c0: 20 62 69 74 20 69 73 20 66 69 67 75 72 69 6e 67   bit is figuring
96d0: 20 6f 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   out the pointer
96e0: 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70   to return in *p
96f0: 7a 54 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 63 68  zTail..  */.  ch
9700: 61 72 20 2a 7a 53 71 6c 38 3b 0a 20 20 63 6f 6e  ar *zSql8;.  con
9710: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 38 20  st char *zTail8 
9720: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
9730: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64  SQLITE_OK;..#ifd
9740: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9750: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
9760: 20 70 70 53 74 6d 74 3d 3d 30 20 29 20 72 65 74   ppStmt==0 ) ret
9770: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
9780: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
9790: 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
97a0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
97b0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 7c 7c 7a  tyCheckOk(db)||z
97c0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
97d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
97e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
97f0: 66 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 7b 0a  f( nBytes>=0 ){.
9800: 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
9810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
9820: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
9830: 6c 3b 0a 20 20 20 20 66 6f 72 28 73 7a 3d 30 3b  l;.    for(sz=0;
9840: 20 73 7a 3c 6e 42 79 74 65 73 20 26 26 20 28 7a   sz<nBytes && (z
9850: 5b 73 7a 5d 21 3d 30 20 7c 7c 20 7a 5b 73 7a 2b  [sz]!=0 || z[sz+
9860: 31 5d 21 3d 30 29 3b 20 73 7a 20 2b 3d 20 32 29  1]!=0); sz += 2)
9870: 7b 7d 0a 20 20 20 20 6e 42 79 74 65 73 20 3d 20  {}.    nBytes = 
9880: 73 7a 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  sz;.  }.  sqlite
9890: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
98a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7a 53 71 6c  ->mutex);.  zSql
98b0: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
98c0: 74 6f 38 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42  to8(db, zSql, nB
98d0: 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 55 54 46  ytes, SQLITE_UTF
98e0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28  16NATIVE);.  if(
98f0: 20 7a 53 71 6c 38 20 29 7b 0a 20 20 20 20 72 63   zSql8 ){.    rc
9900: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e   = sqlite3LockAn
9910: 64 50 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  dPrepare(db, zSq
9920: 6c 38 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67  l8, -1, prepFlag
9930: 73 2c 20 30 2c 20 70 70 53 74 6d 74 2c 20 26 7a  s, 0, ppStmt, &z
9940: 54 61 69 6c 38 29 3b 0a 20 20 7d 0a 0a 20 20 69  Tail8);.  }..  i
9950: 66 28 20 7a 54 61 69 6c 38 20 26 26 20 70 7a 54  f( zTail8 && pzT
9960: 61 69 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ail ){.    /* If
9970: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
9980: 20 72 65 74 75 72 6e 73 20 61 20 74 61 69 6c 20   returns a tail 
9990: 70 6f 69 6e 74 65 72 2c 20 77 65 20 63 61 6c 63  pointer, we calc
99a0: 75 6c 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ulate the.    **
99b0: 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 69 6e   equivalent poin
99c0: 74 65 72 20 69 6e 74 6f 20 74 68 65 20 55 54 46  ter into the UTF
99d0: 2d 31 36 20 73 74 72 69 6e 67 20 62 79 20 63 6f  -16 string by co
99e0: 75 6e 74 69 6e 67 20 74 68 65 20 75 6e 69 63 6f  unting the unico
99f0: 64 65 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63  de.    ** charac
9a00: 74 65 72 73 20 62 65 74 77 65 65 6e 20 7a 53 71  ters between zSq
9a10: 6c 38 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20 61  l8 and zTail8, a
9a20: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 69 6e  nd then returnin
9a30: 67 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  g a pointer.    
9a40: 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ** the same numb
9a50: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
9a60: 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31 36   into the UTF-16
9a70: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a   string..    */.
9a80: 20 20 20 20 69 6e 74 20 63 68 61 72 73 5f 70 61      int chars_pa
9a90: 72 73 65 64 20 3d 20 73 71 6c 69 74 65 33 55 74  rsed = sqlite3Ut
9aa0: 66 38 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38 2c  f8CharLen(zSql8,
9ab0: 20 28 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a 53   (int)(zTail8-zS
9ac0: 71 6c 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54 61  ql8));.    *pzTa
9ad0: 69 6c 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c 20  il = (u8 *)zSql 
9ae0: 2b 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79  + sqlite3Utf16By
9af0: 74 65 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61 72  teLen(zSql, char
9b00: 73 5f 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a 20  s_parsed);.  }. 
9b10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9b20: 62 2c 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72 63  b, zSql8); .  rc
9b30: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
9b40: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
9b50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9b60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9b70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9b80: 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
9b90: 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20  of the official 
9ba0: 41 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64  API.  Legacy and
9bb0: 20 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68   new use.  In th
9bc0: 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73  e legacy.** vers
9bd0: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
9be0: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f  l SQL text is no
9bf0: 74 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70  t saved in the p
9c00: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9c10: 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61  t.** and so if a
9c20: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f   schema change o
9c30: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43  ccurs, SQLITE_SC
9c40: 48 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64  HEMA is returned
9c50: 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73   by.** sqlite3_s
9c60: 74 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e  tep().  In the n
9c70: 65 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ew version, the 
9c80: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
9c90: 74 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a  t is retained.**
9ca0: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
9cb0: 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  nt is automatica
9cc0: 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69  lly recompiled i
9cd0: 66 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e  f an schema chan
9ce0: 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  ge.** occurs..*/
9cf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  .int sqlite3_pre
9d00: 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65  pare16(.  sqlite
9d10: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9d20: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9d30: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
9d40: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
9d50: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31          /* UTF-1
9d60: 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  6 encoded SQL st
9d70: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
9d80: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
9d90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9da0: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
9db0: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
9dc0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
9dd0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
9de0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
9df0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
9e00: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
9e10: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
9e20: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
9e30: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
9e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
9e50: 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  = sqlite3Prepare
9e60: 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  16(db,zSql,nByte
9e70: 73 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69  s,0,ppStmt,pzTai
9e80: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
9e90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
9ea0: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
9eb0: 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45  tmt==0 );  /* VE
9ec0: 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a  RIFY: F13021 */.
9ed0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
9ee0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  nt sqlite3_prepa
9ef0: 72 65 31 36 5f 76 32 28 0a 20 20 73 71 6c 69 74  re16_v2(.  sqlit
9f00: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9f10: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
9f20: 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63   handle. */ .  c
9f30: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c  onst void *zSql,
9f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
9f50: 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  16 encoded SQL s
9f60: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
9f70: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
9f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9f90: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
9fa0: 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tes. */.  sqlite
9fb0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
9fc0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
9fd0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
9fe0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9ff0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
a000: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
a010: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
a020: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
a030: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
a040: 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72   = sqlite3Prepar
a050: 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  e16(db,zSql,nByt
a060: 65 73 2c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  es,SQLITE_PREPAR
a070: 45 5f 53 41 56 45 53 51 4c 2c 70 70 53 74 6d 74  E_SAVESQL,ppStmt
a080: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
a090: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a0a0: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
a0b0: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
a0c0: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
a0d0: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
a0e0: 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
a0f0: 5f 70 72 65 70 61 72 65 31 36 5f 76 33 28 0a 20  _prepare16_v3(. 
a100: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
a120: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
a130: 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  / .  const void 
a140: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f  *zSql,         /
a150: 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  * UTF-16 encoded
a160: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
a170: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a190: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
a1a0: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
a1b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65  unsigned int pre
a1c0: 70 46 6c 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72  pFlags,   /* Zer
a1d0: 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45  o or more SQLITE
a1e0: 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73  _PREPARE_* flags
a1f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
a200: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
a210: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
a220: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
a230: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
a240: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a   const void **pz
a250: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
a260: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
a270: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
a280: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
a290: 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36 28  qlite3Prepare16(
a2a0: 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 0a  db,zSql,nBytes,.
a2b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
a2c0: 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c 7c  PREPARE_SAVESQL|
a2d0: 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49 54  (prepFlags&SQLIT
a2e0: 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c  E_PREPARE_MASK),
a2f0: 0a 20 20 20 20 20 20 20 20 20 70 70 53 74 6d 74  .         ppStmt
a300: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
a310: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a320: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
a330: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
a340: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
a350: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
a360: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
a370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
a380: 36 20 2a 2f 0a                                   6 */.