/ Hex Artifact Content
Login

Artifact a1f7b15ec6e91602ca8193cf322cee443417995577d8543cfc07b71258d7b745:


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 49 6e 69 74 44 61  ecksum(.  InitDa
06b0: 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  ta *pData,      
06c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68            /* Sch
06d0: 65 6d 61 20 70 61 72 73 65 20 63 6f 6e 74 65 78  ema parse contex
06e0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
06f0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
0700: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0710: 66 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 6f  f new database o
0720: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
0730: 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20   char *zRoot,   
0740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
0750: 6f 74 20 70 61 67 65 20 6f 66 20 6e 65 77 20 64  ot page of new d
0760: 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a  atabase object *
0770: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0780: 7a 53 71 6c 20 20 20 20 20 20 20 20 20 20 20 20  zSql            
0790: 20 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20      /* SQL used 
07a0: 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 64 61  to create new da
07b0: 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f  tabase object */
07c0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  .){.  int i;.  u
07d0: 36 34 20 63 6b 73 75 6d 20 3d 20 70 44 61 74 61  64 cksum = pData
07e0: 2d 3e 63 6b 73 75 6d 3b 0a 20 20 69 66 28 20 7a  ->cksum;.  if( z
07f0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
0800: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
0810: 2b 2b 29 20 63 6b 73 75 6d 20 2b 3d 20 28 63 6b  ++) cksum += (ck
0820: 73 75 6d 3c 3c 33 29 20 2b 20 7a 4e 61 6d 65 5b  sum<<3) + zName[
0830: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52  i];.  }.  if( zR
0840: 6f 6f 74 20 29 20 66 6f 72 28 69 3d 30 3b 20 7a  oot ) for(i=0; z
0850: 52 6f 6f 74 5b 69 5d 3b 20 69 2b 2b 29 20 63 6b  Root[i]; i++) ck
0860: 73 75 6d 20 2b 3d 20 28 63 6b 73 75 6d 3c 3c 33  sum += (cksum<<3
0870: 29 20 2b 20 7a 52 6f 6f 74 5b 69 5d 3b 0a 20 20  ) + zRoot[i];.  
0880: 69 66 28 20 7a 53 71 6c 20 29 20 66 6f 72 28 69  if( zSql ) for(i
0890: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 20 69 2b 2b  =0; zSql[i]; i++
08a0: 29 20 63 6b 73 75 6d 20 2b 3d 20 28 63 6b 73 75  ) cksum += (cksu
08b0: 6d 3c 3c 33 29 20 2b 20 7a 53 71 6c 5b 69 5d 3b  m<<3) + zSql[i];
08c0: 0a 20 20 70 44 61 74 61 2d 3e 63 6b 73 75 6d 20  .  pData->cksum 
08d0: 3d 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  = cksum;.}../*.*
08e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
08f0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
0900: 6f 72 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  or the code that
0910: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
0920: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 53  .** database.  S
0930: 65 65 20 73 71 6c 69 74 65 33 49 6e 69 74 28 29  ee sqlite3Init()
0940: 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74   below for addit
0950: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
0960: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
0970: 6e 65 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65  ne is also calle
0980: 64 20 66 72 6f 6d 20 74 68 65 20 4f 50 5f 50 61  d from the OP_Pa
0990: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
09a0: 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a   of the VDBE..**
09b0: 0a 2a 2a 20 45 61 63 68 20 63 61 6c 6c 62 61 63  .** Each callbac
09c0: 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  k contains the f
09d0: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
09e0: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tion:.**.**     
09f0: 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f  argv[0] = name o
0a00: 66 20 74 68 69 6e 67 20 62 65 69 6e 67 20 63 72  f thing being cr
0a10: 65 61 74 65 64 0a 2a 2a 20 20 20 20 20 61 72 67  eated.**     arg
0a20: 76 5b 31 5d 20 3d 20 72 6f 6f 74 20 70 61 67 65  v[1] = root page
0a30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
0a40: 65 20 6f 72 20 69 6e 64 65 78 2e 20 30 20 66 6f  e or index. 0 fo
0a50: 72 20 74 72 69 67 67 65 72 20 6f 72 20 76 69 65  r trigger or vie
0a60: 77 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32  w..**     argv[2
0a70: 5d 20 3d 20 53 51 4c 20 74 65 78 74 20 66 6f 72  ] = SQL text for
0a80: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
0a90: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  ement..**.*/.int
0aa0: 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c   sqlite3InitCall
0ab0: 62 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74  back(void *pInit
0ac0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
0ad0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
0ae0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 49 6e 69 74  NotUsed){.  Init
0af0: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 49  Data *pData = (I
0b00: 6e 69 74 44 61 74 61 2a 29 70 49 6e 69 74 3b 0a  nitData*)pInit;.
0b10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
0b20: 70 44 61 74 61 2d 3e 64 62 3b 0a 20 20 69 6e 74  pData->db;.  int
0b30: 20 69 44 62 20 3d 20 70 44 61 74 61 2d 3e 69 44   iDb = pData->iD
0b40: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  b;..  assert( ar
0b50: 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45  gc==3 );.  UNUSE
0b60: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
0b70: 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 20 20 61  Used, argc);.  a
0b80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
0b90: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
0ba0: 74 65 78 29 20 29 3b 0a 20 20 44 62 43 6c 65 61  tex) );.  DbClea
0bb0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  rProperty(db, iD
0bc0: 62 2c 20 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20  b, DB_Empty);.  
0bd0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0be0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 63 6f 72 72  iled ){.    corr
0bf0: 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c  uptSchema(pData,
0c00: 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20   argv[0], 0);.  
0c10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
0c20: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
0c30: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
0c40: 20 29 3b 0a 20 20 69 66 28 20 61 72 67 76 3d 3d   );.  if( argv==
0c50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
0c60: 2f 2a 20 4d 69 67 68 74 20 68 61 70 70 65 6e 20  /* Might happen 
0c70: 69 66 20 45 4d 50 54 59 5f 52 45 53 55 4c 54 5f  if EMPTY_RESULT_
0c80: 43 41 4c 4c 42 41 43 4b 53 20 61 72 65 20 6f 6e  CALLBACKS are on
0c90: 20 2a 2f 0a 20 20 69 66 28 20 61 72 67 76 5b 31   */.  if( argv[1
0ca0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 72 72  ]==0 ){.    corr
0cb0: 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61 2c  uptSchema(pData,
0cc0: 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20   argv[0], 0);.  
0cd0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
0ce0: 33 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76 5b  3_strnicmp(argv[
0cf0: 32 5d 2c 22 63 72 65 61 74 65 20 22 2c 37 29 3d  2],"create ",7)=
0d00: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6c  =0 ){.    /* Cal
0d10: 6c 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  l the parser to 
0d20: 70 72 6f 63 65 73 73 20 61 20 43 52 45 41 54 45  process a CREATE
0d30: 20 54 41 42 4c 45 2c 20 49 4e 44 45 58 20 6f 72   TABLE, INDEX or
0d40: 20 56 49 45 57 2e 0a 20 20 20 20 2a 2a 20 42 75   VIEW..    ** Bu
0d50: 74 20 62 65 63 61 75 73 65 20 64 62 2d 3e 69 6e  t because db->in
0d60: 69 74 2e 62 75 73 79 20 69 73 20 73 65 74 20 74  it.busy is set t
0d70: 6f 20 31 2c 20 6e 6f 20 56 44 42 45 20 63 6f 64  o 1, no VDBE cod
0d80: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 0a 20  e is generated. 
0d90: 20 20 20 2a 2a 20 6f 72 20 65 78 65 63 75 74 65     ** or execute
0da0: 64 2e 20 20 41 6c 6c 20 74 68 65 20 70 61 72 73  d.  All the pars
0db0: 65 72 20 64 6f 65 73 20 69 73 20 62 75 69 6c 64  er does is build
0dc0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 61   the internal da
0dd0: 74 61 0a 20 20 20 20 2a 2a 20 73 74 72 75 63 74  ta.    ** struct
0de0: 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
0df0: 62 65 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  be the table, in
0e00: 64 65 78 2c 20 6f 72 20 76 69 65 77 2e 0a 20 20  dex, or view..  
0e10: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
0e20: 0a 20 20 20 20 75 38 20 73 61 76 65 64 5f 69 44  .    u8 saved_iD
0e30: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
0e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
0e50: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 54  mt *pStmt;.    T
0e60: 45 53 54 4f 4e 4c 59 28 69 6e 74 20 72 63 70 29  ESTONLY(int rcp)
0e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0e80: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
0e90: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
0ea0: 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  () */..    asser
0eb0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
0ec0: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e 69 74   );.    db->init
0ed0: 2e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20  .iDb = iDb;.    
0ee0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
0ef0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 61   = sqlite3Atoi(a
0f00: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 64 62 2d  rgv[1]);.    db-
0f10: 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69 67  >init.orphanTrig
0f20: 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 54 45 53  ger = 0;.    TES
0f30: 54 4f 4e 4c 59 28 72 63 70 20 3d 20 29 20 73 71  TONLY(rcp = ) sq
0f40: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
0f50: 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 26  , argv[2], -1, &
0f60: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 72  pStmt, 0);.    r
0f70: 63 20 3d 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  c = db->errCode;
0f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
0f90: 26 30 78 46 46 29 3d 3d 28 72 63 70 26 30 78 46  &0xFF)==(rcp&0xF
0fa0: 46 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e  F) );.    db->in
0fb0: 69 74 2e 69 44 62 20 3d 20 73 61 76 65 64 5f 69  it.iDb = saved_i
0fc0: 44 62 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  Db;.    /* asser
0fd0: 74 28 20 73 61 76 65 64 5f 69 44 62 3d 3d 30 20  t( saved_iDb==0 
0fe0: 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  || (db->mDbFlags
0ff0: 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
1000: 29 21 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69  )!=0 ); */.    i
1010: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1020: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62   ){.      if( db
1030: 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72 69  ->init.orphanTri
1040: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  gger ){.        
1050: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 29  assert( iDb==1 )
1060: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1070: 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 72 63         pData->rc
1080: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69   = rc;.        i
1090: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
10a0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MEM ){.         
10b0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
10c0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
10d0: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
10e0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 26 26 20  TE_INTERRUPT && 
10f0: 28 72 63 26 30 78 46 46 29 21 3d 53 51 4c 49 54  (rc&0xFF)!=SQLIT
1100: 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
1110: 20 20 20 20 20 20 63 6f 72 72 75 70 74 53 63 68        corruptSch
1120: 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67 76 5b  ema(pData, argv[
1130: 30 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  0], sqlite3_errm
1140: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20  sg(db));.       
1150: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1160: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
1170: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1180: 7d 65 6c 73 65 20 69 66 28 20 61 72 67 76 5b 30  }else if( argv[0
1190: 5d 3d 3d 30 20 7c 7c 20 28 61 72 67 76 5b 32 5d  ]==0 || (argv[2]
11a0: 21 3d 30 20 26 26 20 61 72 67 76 5b 32 5d 5b 30  !=0 && argv[2][0
11b0: 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 63 6f 72  ]!=0) ){.    cor
11c0: 72 75 70 74 53 63 68 65 6d 61 28 70 44 61 74 61  ruptSchema(pData
11d0: 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20  , argv[0], 0);. 
11e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
11f0: 66 20 74 68 65 20 53 51 4c 20 63 6f 6c 75 6d 6e  f the SQL column
1200: 20 69 73 20 62 6c 61 6e 6b 20 69 74 20 6d 65 61   is blank it mea
1210: 6e 73 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  ns this is an in
1220: 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1230: 77 61 73 20 63 72 65 61 74 65 64 20 74 6f 20 62  was created to b
1240: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
1250: 59 20 6f 72 20 74 6f 20 66 75 6c 66 69 6c 6c 20  Y or to fulfill 
1260: 61 20 55 4e 49 51 55 45 0a 20 20 20 20 2a 2a 20  a UNIQUE.    ** 
1270: 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 61  constraint for a
1280: 20 43 52 45 41 54 45 20 54 41 42 4c 45 2e 20 20   CREATE TABLE.  
1290: 54 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  The index should
12a0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
12b0: 20 20 2a 2a 20 62 65 65 6e 20 63 72 65 61 74 65    ** been create
12c0: 64 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73  d when we proces
12d0: 73 65 64 20 74 68 65 20 43 52 45 41 54 45 20 54  sed the CREATE T
12e0: 41 42 4c 45 2e 20 20 41 6c 6c 20 77 65 20 68 61  ABLE.  All we ha
12f0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ve.    ** to do 
1300: 68 65 72 65 20 69 73 20 72 65 63 6f 72 64 20 74  here is record t
1310: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
1320: 62 65 72 20 66 6f 72 20 74 68 61 74 20 69 6e 64  ber for that ind
1330: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  ex..    */.    I
1340: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1350: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1360: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1370: 61 72 67 76 5b 30 5d 2c 20 64 62 2d 3e 61 44 62  argv[0], db->aDb
1380: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b  [iDb].zDbSName);
1390: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 3d  .    if( pIndex=
13a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
13b0: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66  his can occur if
13c0: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   there exists an
13d0: 20 69 6e 64 65 78 20 6f 6e 20 61 20 54 45 4d 50   index on a TEMP
13e0: 20 74 61 62 6c 65 20 77 68 69 63 68 0a 20 20 20   table which.   
13f0: 20 20 20 2a 2a 20 68 61 73 20 74 68 65 20 73 61     ** has the sa
1400: 6d 65 20 6e 61 6d 65 20 61 73 20 61 6e 6f 74 68  me name as anoth
1410: 65 72 20 69 6e 64 65 78 20 6f 6e 20 61 20 70 65  er index on a pe
1420: 72 6d 61 6e 65 6e 74 20 69 6e 64 65 78 2e 20 20  rmanent index.  
1430: 53 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  Since.      ** t
1440: 68 65 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  he permanent tab
1450: 6c 65 20 69 73 20 68 69 64 64 65 6e 20 62 79 20  le is hidden by 
1460: 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 2c 20  the TEMP table, 
1470: 77 65 20 63 61 6e 20 61 6c 73 6f 0a 20 20 20 20  we can also.    
1480: 20 20 2a 2a 20 73 61 66 65 6c 79 20 69 67 6e 6f    ** safely igno
1490: 72 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  re the index on 
14a0: 74 68 65 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  the permanent ta
14b0: 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ble..      */.  
14c0: 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e      /* Do Nothin
14d0: 67 20 2a 2f 3b 0a 20 20 20 20 7d 65 6c 73 65 20  g */;.    }else 
14e0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
14f0: 74 33 32 28 61 72 67 76 5b 31 5d 2c 20 26 70 49  t32(argv[1], &pI
1500: 6e 64 65 78 2d 3e 74 6e 75 6d 29 3d 3d 30 20 29  ndex->tnum)==0 )
1510: 7b 0a 20 20 20 20 20 20 63 6f 72 72 75 70 74 53  {.      corruptS
1520: 63 68 65 6d 61 28 70 44 61 74 61 2c 20 61 72 67  chema(pData, arg
1530: 76 5b 30 5d 2c 20 22 69 6e 76 61 6c 69 64 20 72  v[0], "invalid r
1540: 6f 6f 74 70 61 67 65 22 29 3b 0a 20 20 20 20 7d  ootpage");.    }
1550: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 44 62 21  .  }..  if( iDb!
1560: 3d 31 20 26 26 20 28 64 62 2d 3e 6f 70 65 6e 46  =1 && (db->openF
1570: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1580: 45 4e 5f 52 45 55 53 45 5f 53 43 48 45 4d 41 29  EN_REUSE_SCHEMA)
1590: 20 29 7b 0a 20 20 20 20 73 63 68 65 6d 61 55 70   ){.    schemaUp
15a0: 64 61 74 65 43 68 65 63 6b 73 75 6d 28 70 44 61  dateChecksum(pDa
15b0: 74 61 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67  ta, argv[0], arg
15c0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
15d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
15e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
15f0: 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61 74   to read the dat
1600: 61 62 61 73 65 20 73 63 68 65 6d 61 20 61 6e 64  abase schema and
1610: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 6e 74 65   initialize inte
1620: 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 73 74 72  rnal.** data str
1630: 75 63 74 75 72 65 73 20 66 6f 72 20 61 20 73 69  uctures for a si
1640: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ngle database fi
1650: 6c 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  le.  The index o
1660: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1670: 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  e file is given 
1680: 62 79 20 69 44 62 2e 20 20 69 44 62 3d 3d 30 20  by iDb.  iDb==0 
1690: 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  is used for the 
16a0: 6d 61 69 6e 0a 2a 2a 20 64 61 74 61 62 61 73 65  main.** database
16b0: 2e 20 20 69 44 62 3d 3d 31 20 73 68 6f 75 6c 64  .  iDb==1 should
16c0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
16d0: 20 69 44 62 3e 3d 32 20 69 73 20 75 73 65 64 20   iDb>=2 is used 
16e0: 66 6f 72 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  for.** auxiliary
16f0: 20 64 61 74 61 62 61 73 65 73 2e 20 20 52 65 74   databases.  Ret
1700: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 53  urn one of the S
1710: 51 4c 49 54 45 5f 20 65 72 72 6f 72 20 63 6f 64  QLITE_ error cod
1720: 65 73 20 74 6f 0a 2a 2a 20 69 6e 64 69 63 61 74  es to.** indicat
1730: 65 20 73 75 63 63 65 73 73 20 6f 72 20 66 61 69  e success or fai
1740: 6c 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lure..*/.int sql
1750: 69 74 65 33 49 6e 69 74 4f 6e 65 28 73 71 6c 69  ite3InitOne(sqli
1760: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
1770: 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73  , char **pzErrMs
1780: 67 2c 20 75 33 32 20 6d 46 6c 61 67 73 29 7b 0a  g, u32 mFlags){.
1790: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
17a0: 69 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  i;.#ifndef SQLIT
17b0: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
17c0: 44 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 23 65  D.  int size;.#e
17d0: 6e 64 69 66 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ndif.  Db *pDb;.
17e0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 61 7a    char const *az
17f0: 41 72 67 5b 34 5d 3b 0a 20 20 69 6e 74 20 6d 65  Arg[4];.  int me
1800: 74 61 5b 35 5d 3b 0a 20 20 49 6e 69 74 44 61 74  ta[5];.  InitDat
1810: 61 20 69 6e 69 74 44 61 74 61 3b 0a 20 20 63 6f  a initData;.  co
1820: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1830: 72 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 70 65  rName;.  int ope
1840: 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  nedTransaction =
1850: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28   0;..  assert( (
1860: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44  db->mDbFlags & D
1870: 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77  BFLAG_SchemaKnow
1880: 6e 4f 6b 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nOk)==0 );.  ass
1890: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
18a0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
18b0: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
18c0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 20 7c 7c 20  iDb].pSchema || 
18d0: 28 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64  (IsReuseSchema(d
18e0: 62 29 20 26 26 20 69 44 62 21 3d 31 29 20 29 3b  b) && iDb!=1) );
18f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1900: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
1910: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1920: 73 65 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20  sert( iDb==1 || 
1930: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1940: 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69  sMutex(db->aDb[i
1950: 44 62 5d 2e 70 42 74 29 20 29 3b 0a 0a 20 20 70  Db].pBt) );..  p
1960: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
1970: 62 5d 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 70  b];.  if( pDb->p
1980: 53 50 6f 6f 6c 20 29 7b 0a 20 20 20 20 61 73 73  SPool ){.    ass
1990: 65 72 74 28 20 49 73 52 65 75 73 65 53 63 68 65  ert( IsReuseSche
19a0: 6d 61 28 64 62 29 20 29 3b 0a 20 20 20 20 2f 2a  ma(db) );.    /*
19b0: 20 53 65 65 20 69 66 20 74 68 65 72 65 20 69 73   See if there is
19c0: 20 61 20 66 72 65 65 20 73 63 68 65 6d 61 20 6f   a free schema o
19d0: 62 6a 65 63 74 20 69 6e 20 74 68 65 20 73 63 68  bject in the sch
19e0: 65 6d 61 2d 70 6f 6f 6c 2e 20 49 66 20 6e 6f 74  ema-pool. If not
19f0: 2c 0a 20 20 20 20 2a 2a 20 64 69 73 63 6f 6e 6e  ,.    ** disconn
1a00: 65 63 74 20 66 72 6f 6d 20 73 61 69 64 20 73 63  ect from said sc
1a10: 68 65 6d 61 20 70 6f 6f 6c 20 61 6e 64 20 63 6f  hema pool and co
1a20: 6e 74 69 6e 75 65 2e 20 54 68 69 73 20 66 75 6e  ntinue. This fun
1a30: 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ction will.    *
1a40: 2a 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 20 28  * connect to a (
1a50: 70 6f 73 73 69 62 6c 79 20 64 69 66 66 65 72 65  possibly differe
1a60: 6e 74 29 20 73 63 68 65 6d 61 2d 70 6f 6f 6c 20  nt) schema-pool 
1a70: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a80: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 44  . */.    if( (pD
1a90: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  b->pSchema = sql
1aa0: 69 74 65 33 53 63 68 65 6d 61 45 78 74 72 61 63  ite3SchemaExtrac
1ab0: 74 28 70 44 62 2d 3e 70 53 50 6f 6f 6c 29 29 20  t(pDb->pSPool)) 
1ac0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ad0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
1af0: 6d 61 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  maDisconnect(db,
1b00: 20 69 44 62 29 3b 0a 20 20 20 20 61 73 73 65 72   iDb);.    asser
1b10: 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 3d  t( pDb->pSchema=
1b20: 3d 30 20 26 26 20 70 44 62 2d 3e 70 53 50 6f 6f  =0 && pDb->pSPoo
1b30: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 44 62 2d  l==0 );.    pDb-
1b40: 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
1b50: 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
1b60: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  0);.    if( pDb-
1b70: 3e 70 53 63 68 65 6d 61 3d 3d 30 20 29 7b 0a 20  >pSchema==0 ){. 
1b80: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b90: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1ba0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1bb0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
1bc0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
1bd0: 31 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  1;..  /* Constru
1be0: 63 74 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ct the in-memory
1bf0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1c00: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 28 73  schema tables (s
1c10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 0a  qlite_master or.
1c20: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
1c30: 5f 6d 61 73 74 65 72 29 20 62 79 20 69 6e 76 6f  _master) by invo
1c40: 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65 72 20  king the parser 
1c50: 64 69 72 65 63 74 6c 79 2e 20 20 54 68 65 20 61  directly.  The a
1c60: 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20  ppropriate.  ** 
1c70: 74 61 62 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20  table name will 
1c80: 62 65 20 69 6e 73 65 72 74 65 64 20 61 75 74 6f  be inserted auto
1c90: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
1ca0: 20 70 61 72 73 65 72 20 73 6f 20 77 65 20 63 61   parser so we ca
1cb0: 6e 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  n just.  ** use 
1cc0: 74 68 65 20 61 62 62 72 65 76 69 61 74 69 6f 6e  the abbreviation
1cd0: 20 22 78 22 20 68 65 72 65 2e 20 20 54 68 65 20   "x" here.  The 
1ce0: 70 61 72 73 65 72 20 77 69 6c 6c 20 61 6c 73 6f  parser will also
1cf0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74   automatically t
1d00: 61 67 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  ag.  ** the sche
1d10: 6d 61 20 74 61 62 6c 65 20 61 73 20 72 65 61 64  ma table as read
1d20: 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 61 7a 41 72  -only. */.  azAr
1d30: 67 5b 30 5d 20 3d 20 7a 4d 61 73 74 65 72 4e 61  g[0] = zMasterNa
1d40: 6d 65 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  me = SCHEMA_TABL
1d50: 45 28 69 44 62 29 3b 0a 20 20 61 7a 41 72 67 5b  E(iDb);.  azArg[
1d60: 31 5d 20 3d 20 22 31 22 3b 0a 20 20 61 7a 41 72  1] = "1";.  azAr
1d70: 67 5b 32 5d 20 3d 20 22 43 52 45 41 54 45 20 54  g[2] = "CREATE T
1d80: 41 42 4c 45 20 78 28 74 79 70 65 20 74 65 78 74  ABLE x(type text
1d90: 2c 6e 61 6d 65 20 74 65 78 74 2c 74 62 6c 5f 6e  ,name text,tbl_n
1da0: 61 6d 65 20 74 65 78 74 2c 22 0a 20 20 20 20 20  ame text,".     
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 22 72 6f 6f 74 70 61 67 65         "rootpage
1dd0: 20 69 6e 74 2c 73 71 6c 20 74 65 78 74 29 22 3b   int,sql text)";
1de0: 0a 20 20 61 7a 41 72 67 5b 33 5d 20 3d 20 30 3b  .  azArg[3] = 0;
1df0: 0a 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d  .  initData.db =
1e00: 20 64 62 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e   db;.  initData.
1e10: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 6e 69  iDb = iDb;.  ini
1e20: 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54  tData.rc = SQLIT
1e30: 45 5f 4f 4b 3b 0a 20 20 69 6e 69 74 44 61 74 61  E_OK;.  initData
1e40: 2e 70 7a 45 72 72 4d 73 67 20 3d 20 70 7a 45 72  .pzErrMsg = pzEr
1e50: 72 4d 73 67 3b 0a 20 20 69 6e 69 74 44 61 74 61  rMsg;.  initData
1e60: 2e 6d 49 6e 69 74 46 6c 61 67 73 20 3d 20 6d 46  .mInitFlags = mF
1e70: 6c 61 67 73 3b 0a 20 20 73 71 6c 69 74 65 33 49  lags;.  sqlite3I
1e80: 6e 69 74 43 61 6c 6c 62 61 63 6b 28 26 69 6e 69  nitCallback(&ini
1e90: 74 44 61 74 61 2c 20 33 2c 20 28 63 68 61 72 20  tData, 3, (char 
1ea0: 2a 2a 29 61 7a 41 72 67 2c 20 30 29 3b 0a 20 20  **)azArg, 0);.  
1eb0: 69 66 28 20 69 6e 69 74 44 61 74 61 2e 72 63 20  if( initData.rc 
1ec0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69 74  ){.    rc = init
1ed0: 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 67 6f 74  Data.rc;.    got
1ee0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1ef0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
1f00: 63 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64 20 74  cursor to hold t
1f10: 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1f20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d  .  */.  if( pDb-
1f30: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  >pBt==0 ){.    a
1f40: 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 29 3b  ssert( iDb==1 );
1f50: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
1f60: 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 53 63 68  ty(db, 1, DB_Sch
1f70: 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20  emaLoaded);.    
1f80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f90: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1fa0: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ut;.  }..  /* If
1fb0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
1fc0: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6f 6e 6c  ready a read-onl
1fd0: 79 20 28 6f 72 20 72 65 61 64 2d 77 72 69 74 65  y (or read-write
1fe0: 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  ) transaction op
1ff0: 65 6e 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ened.  ** on the
2000: 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
2010: 2c 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20  , open one now. 
2020: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
2030: 20 69 73 20 6f 70 65 6e 65 64 2c 20 69 74 20 0a   is opened, it .
2040: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c 6f    ** will be clo
2050: 73 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  sed before this 
2060: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2070: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
2080: 74 72 65 65 45 6e 74 65 72 28 70 44 62 2d 3e 70  treeEnter(pDb->p
2090: 42 74 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  Bt);.  if( !sqli
20a0: 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
20b0: 54 72 61 6e 73 28 70 44 62 2d 3e 70 42 74 29 20  Trans(pDb->pBt) 
20c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20d0: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
20e0: 6e 73 28 70 44 62 2d 3e 70 42 74 2c 20 30 2c 20  ns(pDb->pBt, 0, 
20f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2110: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2120: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62  ing(pzErrMsg, db
2130: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
2140: 72 63 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rc));.      goto
2150: 20 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f   initone_error_o
2160: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  ut;.    }.    op
2170: 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20  enedTransaction 
2180: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  = 1;.  }..  /* G
2190: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21a0: 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
21b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 65 74 61  ..  **.  ** Meta
21c0: 20 76 61 6c 75 65 73 20 61 72 65 20 61 73 20 66   values are as f
21d0: 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 20 20 20 20  ollows:.  **    
21e0: 6d 65 74 61 5b 30 5d 20 20 20 53 63 68 65 6d 61  meta[0]   Schema
21f0: 20 63 6f 6f 6b 69 65 2e 20 20 43 68 61 6e 67 65   cookie.  Change
2200: 73 20 77 69 74 68 20 65 61 63 68 20 73 63 68 65  s with each sche
2210: 6d 61 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2a 20  ma change..  ** 
2220: 20 20 20 6d 65 74 61 5b 31 5d 20 20 20 46 69 6c     meta[1]   Fil
2230: 65 20 66 6f 72 6d 61 74 20 6f 66 20 73 63 68 65  e format of sche
2240: 6d 61 20 6c 61 79 65 72 2e 0a 20 20 2a 2a 20 20  ma layer..  **  
2250: 20 20 6d 65 74 61 5b 32 5d 20 20 20 53 69 7a 65    meta[2]   Size
2260: 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
2270: 68 65 2e 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61  he..  **    meta
2280: 5b 33 5d 20 20 20 4c 61 72 67 65 73 74 20 72 6f  [3]   Largest ro
2290: 6f 74 70 61 67 65 20 28 61 75 74 6f 2f 69 6e 63  otpage (auto/inc
22a0: 72 5f 76 61 63 75 75 6d 20 6d 6f 64 65 29 0a 20  r_vacuum mode). 
22b0: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 34 5d 20 20   **    meta[4]  
22c0: 20 44 62 20 74 65 78 74 20 65 6e 63 6f 64 69 6e   Db text encodin
22d0: 67 2e 20 31 3a 55 54 46 2d 38 20 32 3a 55 54 46  g. 1:UTF-8 2:UTF
22e0: 2d 31 36 4c 45 20 33 3a 55 54 46 2d 31 36 42 45  -16LE 3:UTF-16BE
22f0: 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 35 5d  .  **    meta[5]
2300: 20 20 20 55 73 65 72 20 76 65 72 73 69 6f 6e 0a     User version.
2310: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 36 5d 20    **    meta[6] 
2320: 20 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61    Incremental va
2330: 63 75 75 6d 20 6d 6f 64 65 0a 20 20 2a 2a 20 20  cuum mode.  **  
2340: 20 20 6d 65 74 61 5b 37 5d 20 20 20 75 6e 75 73    meta[7]   unus
2350: 65 64 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b  ed.  **    meta[
2360: 38 5d 20 20 20 75 6e 75 73 65 64 0a 20 20 2a 2a  8]   unused.  **
2370: 20 20 20 20 6d 65 74 61 5b 39 5d 20 20 20 75 6e      meta[9]   un
2380: 75 73 65 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  used.  **.  ** N
2390: 6f 74 65 3a 20 54 68 65 20 23 64 65 66 69 6e 65  ote: The #define
23a0: 64 20 53 51 4c 49 54 45 5f 55 54 46 2a 20 73 79  d SQLITE_UTF* sy
23b0: 6d 62 6f 6c 73 20 69 6e 20 73 71 6c 69 74 65 49  mbols in sqliteI
23c0: 6e 74 2e 68 20 63 6f 72 72 65 73 70 6f 6e 64 20  nt.h correspond 
23d0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 70 6f 73 73  to.  ** the poss
23e0: 69 62 6c 65 20 76 61 6c 75 65 73 20 6f 66 20 6d  ible values of m
23f0: 65 74 61 5b 34 5d 2e 0a 20 20 2a 2f 0a 20 20 66  eta[4]..  */.  f
2400: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
2410: 69 7a 65 28 6d 65 74 61 29 3b 20 69 2b 2b 29 7b  ize(meta); i++){
2420: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2430: 65 47 65 74 4d 65 74 61 28 70 44 62 2d 3e 70 42  eGetMeta(pDb->pB
2440: 74 2c 20 69 2b 31 2c 20 28 75 33 32 20 2a 29 26  t, i+1, (u32 *)&
2450: 6d 65 74 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  meta[i]);.  }.  
2460: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
2470: 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74   SQLITE_ResetDat
2480: 61 62 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20  abase)!=0 ){.   
2490: 20 6d 65 6d 73 65 74 28 6d 65 74 61 2c 20 30 2c   memset(meta, 0,
24a0: 20 73 69 7a 65 6f 66 28 6d 65 74 61 29 29 3b 0a   sizeof(meta));.
24b0: 20 20 7d 0a 20 20 70 44 62 2d 3e 70 53 63 68 65    }.  pDb->pSche
24c0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
24d0: 65 20 3d 20 6d 65 74 61 5b 42 54 52 45 45 5f 53  e = meta[BTREE_S
24e0: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2d 31 5d  CHEMA_VERSION-1]
24f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69  ;..  /* If openi
2500: 6e 67 20 61 20 6e 6f 6e 2d 65 6d 70 74 79 20 64  ng a non-empty d
2510: 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 20 74  atabase, check t
2520: 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
2530: 2e 20 46 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  . For the.  ** m
2540: 61 69 6e 20 64 61 74 61 62 61 73 65 2c 20 73 65  ain database, se
2550: 74 20 73 71 6c 69 74 65 33 2e 65 6e 63 20 74 6f  t sqlite3.enc to
2560: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
2570: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2580: 73 65 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20  se..  ** For an 
2590: 61 74 74 61 63 68 65 64 20 64 62 2c 20 69 74 20  attached db, it 
25a0: 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  is an error if t
25b0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 6e  he encoding is n
25c0: 6f 74 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ot the same.  **
25d0: 20 61 73 20 73 71 6c 69 74 65 33 2e 65 6e 63 2e   as sqlite3.enc.
25e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6d 65 74 61  .  */.  if( meta
25f0: 5b 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f  [BTREE_TEXT_ENCO
2600: 44 49 4e 47 2d 31 5d 20 29 7b 20 20 2f 2a 20 74  DING-1] ){  /* t
2610: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  ext encoding */.
2620: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29      if( iDb==0 )
2630: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2640: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
2650: 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 3b 0a 20    u8 encoding;. 
2660: 20 20 20 20 20 2f 2a 20 49 66 20 6f 70 65 6e 69       /* If openi
2670: 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
2680: 62 61 73 65 2c 20 73 65 74 20 45 4e 43 28 64 62  base, set ENC(db
2690: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 65 6e 63 6f  ). */.      enco
26a0: 64 69 6e 67 20 3d 20 28 75 38 29 6d 65 74 61 5b  ding = (u8)meta[
26b0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
26c0: 49 4e 47 2d 31 5d 20 26 20 33 3b 0a 20 20 20 20  ING-1] & 3;.    
26d0: 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 3d 3d    if( encoding==
26e0: 30 20 29 20 65 6e 63 6f 64 69 6e 67 20 3d 20 53  0 ) encoding = S
26f0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
2700: 20 20 45 4e 43 28 64 62 29 20 3d 20 65 6e 63 6f    ENC(db) = enco
2710: 64 69 6e 67 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ding;.#else.    
2720: 20 20 45 4e 43 28 64 62 29 20 3d 20 53 51 4c 49    ENC(db) = SQLI
2730: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
2740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2750: 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 61   /* If opening a
2760: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
2770: 61 73 65 2c 20 74 68 65 20 65 6e 63 6f 64 69 6e  ase, the encodin
2780: 67 20 6d 75 63 68 20 6d 61 74 63 68 20 45 4e 43  g much match ENC
2790: 28 64 62 29 20 2a 2f 0a 20 20 20 20 20 20 69 66  (db) */.      if
27a0: 28 20 6d 65 74 61 5b 42 54 52 45 45 5f 54 45 58  ( meta[BTREE_TEX
27b0: 54 5f 45 4e 43 4f 44 49 4e 47 2d 31 5d 21 3d 45  T_ENCODING-1]!=E
27c0: 4e 43 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20  NC(db) ){.      
27d0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
27e0: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c  ng(pzErrMsg, db,
27f0: 20 22 61 74 74 61 63 68 65 64 20 64 61 74 61 62   "attached datab
2800: 61 73 65 73 20 6d 75 73 74 20 75 73 65 20 74 68  ases must use th
2810: 65 20 73 61 6d 65 22 0a 20 20 20 20 20 20 20 20  e same".        
2820: 20 20 20 20 22 20 74 65 78 74 20 65 6e 63 6f 64      " text encod
2830: 69 6e 67 20 61 73 20 6d 61 69 6e 20 64 61 74 61  ing as main data
2840: 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  base");.        
2850: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2860: 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
2870: 69 6e 69 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75  initone_error_ou
2880: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2890: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 62  .  }else{.    Db
28a0: 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
28b0: 69 44 62 2c 20 44 42 5f 45 6d 70 74 79 29 3b 0a  iDb, DB_Empty);.
28c0: 20 20 7d 0a 20 20 70 44 62 2d 3e 70 53 63 68 65    }.  pDb->pSche
28d0: 6d 61 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  ma->enc = ENC(db
28e0: 29 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 70  );..  if( pDb->p
28f0: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
2900: 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ze==0 ){.#ifndef
2910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
2920: 52 45 43 41 54 45 44 0a 20 20 20 20 73 69 7a 65  RECATED.    size
2930: 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2940: 33 32 28 6d 65 74 61 5b 42 54 52 45 45 5f 44 45  32(meta[BTREE_DE
2950: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
2960: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69  -1]);.    if( si
2970: 7a 65 3d 3d 30 20 29 7b 20 73 69 7a 65 20 3d 20  ze==0 ){ size = 
2980: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
2990: 41 43 48 45 5f 53 49 5a 45 3b 20 7d 0a 20 20 20  ACHE_SIZE; }.   
29a0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
29b0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
29c0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 44 62 2d  ;.#else.    pDb-
29d0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
29e0: 73 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  size = SQLITE_DE
29f0: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
2a00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2a10: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
2a20: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
2a30: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
2a40: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a  che_size);.  }..
2a50: 20 20 2f 2a 0a 20 20 2a 2a 20 66 69 6c 65 5f 66    /*.  ** file_f
2a60: 6f 72 6d 61 74 3d 3d 31 20 20 20 20 56 65 72 73  ormat==1    Vers
2a70: 69 6f 6e 20 33 2e 30 2e 30 2e 0a 20 20 2a 2a 20  ion 3.0.0..  ** 
2a80: 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 32 20 20  file_format==2  
2a90: 20 20 56 65 72 73 69 6f 6e 20 33 2e 31 2e 33 2e    Version 3.1.3.
2aa0: 20 20 2f 2f 20 41 4c 54 45 52 20 54 41 42 4c 45    // ALTER TABLE
2ab0: 20 41 44 44 20 43 4f 4c 55 4d 4e 0a 20 20 2a 2a   ADD COLUMN.  **
2ac0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 33 20   file_format==3 
2ad0: 20 20 20 56 65 72 73 69 6f 6e 20 33 2e 31 2e 34     Version 3.1.4
2ae0: 2e 20 20 2f 2f 20 64 69 74 74 6f 20 62 75 74 20  .  // ditto but 
2af0: 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65  with non-NULL de
2b00: 66 61 75 6c 74 73 0a 20 20 2a 2a 20 66 69 6c 65  faults.  ** file
2b10: 5f 66 6f 72 6d 61 74 3d 3d 34 20 20 20 20 56 65  _format==4    Ve
2b20: 72 73 69 6f 6e 20 33 2e 33 2e 30 2e 20 20 2f 2f  rsion 3.3.0.  //
2b30: 20 44 45 53 43 20 69 6e 64 69 63 65 73 2e 20 20   DESC indices.  
2b40: 42 6f 6f 6c 65 61 6e 20 63 6f 6e 73 74 61 6e 74  Boolean constant
2b50: 73 0a 20 20 2a 2f 0a 20 20 70 44 62 2d 3e 70 53  s.  */.  pDb->pS
2b60: 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
2b70: 61 74 20 3d 20 28 75 38 29 6d 65 74 61 5b 42 54  at = (u8)meta[BT
2b80: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2d  REE_FILE_FORMAT-
2b90: 31 5d 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 70  1];.  if( pDb->p
2ba0: 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
2bb0: 6d 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  mat==0 ){.    pD
2bc0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
2bd0: 5f 66 6f 72 6d 61 74 20 3d 20 31 3b 0a 20 20 7d  _format = 1;.  }
2be0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
2bf0: 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
2c00: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45  >SQLITE_MAX_FILE
2c10: 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 73  _FORMAT ){.    s
2c20: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
2c30: 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 75  pzErrMsg, db, "u
2c40: 6e 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 20  nsupported file 
2c50: 66 6f 72 6d 61 74 22 29 3b 0a 20 20 20 20 72 63  format");.    rc
2c60: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2c70: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 69 74 6f 6e  .    goto initon
2c80: 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  e_error_out;.  }
2c90: 0a 0a 20 20 2f 2a 20 54 69 63 6b 65 74 20 23 32  ..  /* Ticket #2
2ca0: 38 30 34 3a 20 20 57 68 65 6e 20 77 65 20 6f 70  804:  When we op
2cb0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  en a database in
2cc0: 20 74 68 65 20 6e 65 77 65 72 20 66 69 6c 65 20   the newer file 
2cd0: 66 6f 72 6d 61 74 2c 0a 20 20 2a 2a 20 63 6c 65  format,.  ** cle
2ce0: 61 72 20 74 68 65 20 6c 65 67 61 63 79 5f 66 69  ar the legacy_fi
2cf0: 6c 65 5f 66 6f 72 6d 61 74 20 70 72 61 67 6d 61  le_format pragma
2d00: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 61 20   flag so that a 
2d10: 56 41 43 55 55 4d 20 77 69 6c 6c 0a 20 20 2a 2a  VACUUM will.  **
2d20: 20 6e 6f 74 20 64 6f 77 6e 67 72 61 64 65 20 74   not downgrade t
2d30: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
2d40: 74 68 75 73 20 69 6e 76 61 6c 69 64 61 74 65 20  thus invalidate 
2d50: 61 6e 79 20 64 65 73 63 65 6e 64 69 6e 67 0a 20  any descending. 
2d60: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 68 61 74   ** indices that
2d70: 20 74 68 65 20 75 73 65 72 20 6d 69 67 68 74 20   the user might 
2d80: 68 61 76 65 20 63 72 65 61 74 65 64 2e 0a 20 20  have created..  
2d90: 2a 2f 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  */.  if( iDb==0 
2da0: 26 26 20 6d 65 74 61 5b 42 54 52 45 45 5f 46 49  && meta[BTREE_FI
2db0: 4c 45 5f 46 4f 52 4d 41 54 2d 31 5d 3e 3d 34 20  LE_FORMAT-1]>=4 
2dc0: 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  ){.    db->flags
2dd0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4c 65 67 61   &= ~SQLITE_Lega
2de0: 63 79 46 69 6c 65 46 6d 74 3b 0a 20 20 7d 0a 0a  cyFileFmt;.  }..
2df0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63    /* Read the sc
2e00: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
2e10: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 68 65   out of the sche
2e20: 6d 61 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20  ma tables.  */. 
2e30: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
2e40: 74 2e 62 75 73 79 20 29 3b 0a 20 20 7b 0a 20 20  t.busy );.  {.  
2e50: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2e60: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2e70: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
2e80: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2e90: 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
2ea0: 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 25 73 20   FROM \"%w\".%s 
2eb0: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
2ec0: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
2ed0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
2ee0: 7a 4d 61 73 74 65 72 4e 61 6d 65 29 3b 0a 23 69  zMasterName);.#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
2f10: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
2f20: 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
2f30: 0a 20 20 20 20 20 20 78 41 75 74 68 20 3d 20 64  .      xAuth = d
2f40: 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 20 20  b->xAuth;.      
2f50: 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 23  db->xAuth = 0;.#
2f60: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
2f70: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
2f80: 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49  , zSql, sqlite3I
2f90: 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e  nitCallback, &in
2fa0: 69 74 44 61 74 61 2c 20 30 29 3b 0a 23 69 66 6e  itData, 0);.#ifn
2fb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fc0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
2fd0: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
2fe0: 78 41 75 74 68 3b 0a 20 20 20 20 7d 0a 23 65 6e  xAuth;.    }.#en
2ff0: 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
3000: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
3010: 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20   initData.rc;.  
3020: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3030: 64 62 2c 20 7a 53 71 6c 29 3b 0a 23 69 66 6e 64  db, zSql);.#ifnd
3040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
3050: 4e 41 4c 59 5a 45 0a 20 20 20 20 69 66 28 20 72  NALYZE.    if( r
3060: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 6e 61        sqlite3Ana
3080: 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 69 44  lysisLoad(db, iD
3090: 62 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  b);.    }.#endif
30a0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
30b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
30c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
30d0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
30e0: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
30f0: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
3100: 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  n(db);.  }.  if(
3110: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
3120: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  | (db->flags&SQL
3130: 49 54 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f  ITE_NoSchemaErro
3140: 72 29 29 7b 0a 20 20 20 20 2f 2a 20 42 6c 61 63  r)){.    /* Blac
3150: 6b 20 6d 61 67 69 63 3a 20 49 66 20 74 68 65 20  k magic: If the 
3160: 53 51 4c 49 54 45 5f 4e 6f 53 63 68 65 6d 61 45  SQLITE_NoSchemaE
3170: 72 72 6f 72 20 66 6c 61 67 20 69 73 20 73 65 74  rror flag is set
3180: 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 0a  , then consider.
3190: 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
31a0: 61 20 6c 6f 61 64 65 64 2c 20 65 76 65 6e 20 69  a loaded, even i
31b0: 66 20 65 72 72 6f 72 73 20 6f 63 63 75 72 72 65  f errors occurre
31c0: 64 2e 20 49 6e 20 74 68 69 73 20 73 69 74 75 61  d. In this situa
31d0: 74 69 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  tion the .    **
31e0: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
31f0: 5f 70 72 65 70 61 72 65 28 29 20 6f 70 65 72 61  _prepare() opera
3200: 74 69 6f 6e 20 77 69 6c 6c 20 66 61 69 6c 2c 20  tion will fail, 
3210: 62 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  but the followin
3220: 67 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 77 69 6c  g one.    ** wil
3230: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  l attempt to com
3240: 70 69 6c 65 20 74 68 65 20 73 75 70 70 6c 69 65  pile the supplie
3250: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  d statement agai
3260: 6e 73 74 20 77 68 61 74 65 76 65 72 20 73 75 62  nst whatever sub
3270: 73 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  set.    ** of th
3280: 65 20 73 63 68 65 6d 61 20 77 61 73 20 6c 6f 61  e schema was loa
3290: 64 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ded before the e
32a0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 54  rror occurred. T
32b0: 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a  he primary.    *
32c0: 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  * purpose of thi
32d0: 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77 20 61 63  s is to allow ac
32e0: 63 65 73 73 20 74 6f 20 74 68 65 20 73 71 6c 69  cess to the sqli
32f0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  te_master table.
3300: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
3310: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 68 61   its contents ha
3320: 76 65 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65  ve been corrupte
3330: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 44 62  d..    */.    Db
3340: 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
3350: 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  iDb, DB_SchemaLo
3360: 61 64 65 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  aded);.    rc = 
3370: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
3380: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3390: 5f 4f 4b 20 26 26 20 69 44 62 21 3d 31 20 26 26  _OK && iDb!=1 &&
33a0: 20 28 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   (db->openFlags 
33b0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
33c0: 55 53 45 5f 53 43 48 45 4d 41 29 20 29 7b 0a 20  USE_SCHEMA) ){. 
33d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
33e0: 63 68 65 6d 61 43 6f 6e 6e 65 63 74 28 64 62 2c  chemaConnect(db,
33f0: 20 69 44 62 2c 20 69 6e 69 74 44 61 74 61 2e 63   iDb, initData.c
3400: 6b 73 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ksum);.  }..  /*
3410: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 61   Jump here for a
3420: 6e 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  n error that occ
3430: 75 72 73 20 61 66 74 65 72 20 73 75 63 63 65 73  urs after succes
3440: 73 66 75 6c 6c 79 20 61 6c 6c 6f 63 61 74 69 6e  sfully allocatin
3450: 67 0a 20 20 2a 2a 20 63 75 72 4d 61 69 6e 20 61  g.  ** curMain a
3460: 6e 64 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  nd calling sqlit
3470: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 2e 20  e3BtreeEnter(). 
3480: 46 6f 72 20 61 6e 20 65 72 72 6f 72 20 74 68 61  For an error tha
3490: 74 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 62 65  t occurs.  ** be
34a0: 66 6f 72 65 20 74 68 61 74 20 70 6f 69 6e 74 2c  fore that point,
34b0: 20 6a 75 6d 70 20 74 6f 20 65 72 72 6f 72 5f 6f   jump to error_o
34c0: 75 74 2e 0a 20 20 2a 2f 0a 69 6e 69 74 6f 6e 65  ut..  */.initone
34d0: 5f 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69 66  _error_out:.  if
34e0: 28 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74  ( openedTransact
34f0: 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ion ){.    sqlit
3500: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 44  e3BtreeCommit(pD
3510: 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73  b->pBt);.  }.  s
3520: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
3530: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 0a 65 72 72  (pDb->pBt);..err
3540: 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  or_out:.  if( rc
3550: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
3560: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
3570: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
3580: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
3590: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
35a0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  db);.    }.    s
35b0: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
35c0: 68 65 6d 61 28 64 62 2c 20 69 44 62 29 3b 0a 20  hema(db, iDb);. 
35d0: 20 7d 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75   }.  db->init.bu
35e0: 73 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  sy = 0;.  return
35f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
3600: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 64 61 74  itialize all dat
3610: 61 62 61 73 65 20 66 69 6c 65 73 20 2d 20 74 68  abase files - th
3620: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
3630: 66 69 6c 65 2c 20 74 68 65 20 66 69 6c 65 0a 2a  file, the file.*
3640: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
3650: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3660: 2c 20 61 6e 64 20 61 6e 79 20 61 64 64 69 74 69  , and any additi
3670: 6f 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  onal database fi
3680: 6c 65 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 75  les.** created u
3690: 73 69 6e 67 20 41 54 54 41 43 48 20 73 74 61 74  sing ATTACH stat
36a0: 65 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  ements.  Return 
36b0: 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 20  a success code. 
36c0: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
36d0: 6f 63 63 75 72 73 2c 20 77 72 69 74 65 20 61 6e  occurs, write an
36e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
36f0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
3700: 2a 0a 2a 2a 20 41 66 74 65 72 20 61 20 64 61 74  *.** After a dat
3710: 61 62 61 73 65 20 69 73 20 69 6e 69 74 69 61 6c  abase is initial
3720: 69 7a 65 64 2c 20 74 68 65 20 44 42 5f 53 63 68  ized, the DB_Sch
3730: 65 6d 61 4c 6f 61 64 65 64 20 62 69 74 20 69 73  emaLoaded bit is
3740: 20 73 65 74 0a 2a 2a 20 62 69 74 20 69 73 20 73   set.** bit is s
3750: 65 74 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  et in the flags 
3760: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 44 62 20  field of the Db 
3770: 73 74 72 75 63 74 75 72 65 2e 20 49 66 20 74 68  structure. If th
3780: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
3790: 6c 65 20 77 61 73 20 6f 66 20 7a 65 72 6f 2d 6c  le was of zero-l
37a0: 65 6e 67 74 68 2c 20 74 68 65 6e 20 74 68 65 20  ength, then the 
37b0: 44 42 5f 45 6d 70 74 79 20 66 6c 61 67 20 69 73  DB_Empty flag is
37c0: 20 61 6c 73 6f 20 73 65 74 2e 0a 2a 2f 0a 69 6e   also set..*/.in
37d0: 74 20 73 71 6c 69 74 65 33 49 6e 69 74 28 73 71  t sqlite3Init(sq
37e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20  lite3 *db, char 
37f0: 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69  **pzErrMsg){.  i
3800: 6e 74 20 69 2c 20 72 63 3b 0a 20 20 69 6e 74 20  nt i, rc;.  int 
3810: 63 6f 6d 6d 69 74 5f 69 6e 74 65 72 6e 61 6c 20  commit_internal 
3820: 3d 20 21 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  = !(db->mDbFlags
3830: 26 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  &DBFLAG_SchemaCh
3840: 61 6e 67 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  ange);.  .  asse
3850: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3860: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
3870: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
3880: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3890: 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 30 5d  Mutex(db->aDb[0]
38a0: 2e 70 42 74 29 20 29 3b 0a 20 20 61 73 73 65 72  .pBt) );.  asser
38b0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
38c0: 3d 3d 30 20 29 3b 0a 20 20 45 4e 43 28 64 62 29  ==0 );.  ENC(db)
38d0: 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62   = SCHEMA_ENC(db
38e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
38f0: 3e 6e 44 62 3e 30 20 29 3b 0a 20 20 2f 2a 20 44  >nDb>0 );.  /* D
3900: 6f 20 74 68 65 20 6d 61 69 6e 20 73 63 68 65 6d  o the main schem
3910: 61 20 66 69 72 73 74 20 2a 2f 0a 20 20 69 66 28  a first */.  if(
3920: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
3930: 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  db, 0, DB_Schema
3940: 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 72  Loaded) ){.    r
3950: 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 4f  c = sqlite3InitO
3960: 6e 65 28 64 62 2c 20 30 2c 20 70 7a 45 72 72 4d  ne(db, 0, pzErrM
3970: 73 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  sg, 0);.    if( 
3980: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
3990: 20 20 7d 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68    }.  /* All oth
39a0: 65 72 20 73 63 68 65 6d 61 73 20 61 66 74 65 72  er schemas after
39b0: 20 74 68 65 20 6d 61 69 6e 20 73 63 68 65 6d 61   the main schema
39c0: 2e 20 54 68 65 20 22 74 65 6d 70 22 20 73 63 68  . The "temp" sch
39d0: 65 6d 61 20 6d 75 73 74 20 62 65 20 6c 61 73 74  ema must be last
39e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 64 62 2d 3e   */.  for(i=db->
39f0: 6e 44 62 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  nDb-1; i>0; i--)
3a00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  {.    assert( i=
3a10: 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =1 || sqlite3Btr
3a20: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d  eeHoldsMutex(db-
3a30: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 3b 0a  >aDb[i].pBt) );.
3a40: 20 20 20 20 69 66 28 20 21 44 62 48 61 73 50 72      if( !DbHasPr
3a50: 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42  operty(db, i, DB
3a60: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
3a70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
3a80: 69 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20  ite3InitOne(db, 
3a90: 69 2c 20 70 7a 45 72 72 4d 73 67 2c 20 30 29 3b  i, pzErrMsg, 0);
3aa0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
3ab0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
3ac0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 6d 6d 69  .  }.  if( commi
3ad0: 74 5f 69 6e 74 65 72 6e 61 6c 20 29 7b 0a 20 20  t_internal ){.  
3ae0: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
3af0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
3b00: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
3b10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3b20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3b30: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
3b40: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
3b50: 65 6d 61 20 69 73 20 61 6c 72 65 61 64 79 20 69  ema is already i
3b60: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 4f  nitialized..** O
3b70: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 63  therwise, the sc
3b80: 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 2e 20  hema is loaded. 
3b90: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
3ba0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
3bb0: 74 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  t sqlite3ReadSch
3bc0: 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
3bd0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
3be0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
3bf0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
3c00: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
3c10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3c20: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
3c30: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
3c40: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 72 63 20  .busy ){.    rc 
3c50: 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
3c60: 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  , &pParse->zErrM
3c70: 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sg);.    if( rc!
3c80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3c90: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
3ca0: 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72 73   rc;.      pPars
3cb0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
3cc0: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e 6f 53  else if( db->noS
3cd0: 68 61 72 65 64 43 61 63 68 65 20 26 26 20 21 49  haredCache && !I
3ce0: 73 52 65 75 73 65 53 63 68 65 6d 61 28 64 62 29  sReuseSchema(db)
3cf0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44   ){.      db->mD
3d00: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
3d10: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a  _SchemaKnownOk;.
3d20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3d30: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
3d40: 20 43 68 65 63 6b 20 73 63 68 65 6d 61 20 63 6f   Check schema co
3d50: 6f 6b 69 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  okies in all dat
3d60: 61 62 61 73 65 73 2e 20 20 49 66 20 61 6e 79 20  abases.  If any 
3d70: 63 6f 6f 6b 69 65 20 69 73 20 6f 75 74 0a 2a 2a  cookie is out.**
3d80: 20 6f 66 20 64 61 74 65 20 73 65 74 20 70 50 61   of date set pPa
3d90: 72 73 65 2d 3e 72 63 20 74 6f 20 53 51 4c 49 54  rse->rc to SQLIT
3da0: 45 5f 53 43 48 45 4d 41 2e 20 20 49 66 20 61 6c  E_SCHEMA.  If al
3db0: 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
3dc0: 0a 2a 2a 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** make no chan
3dd0: 67 65 73 20 74 6f 20 70 50 61 72 73 65 2d 3e 72  ges to pParse->r
3de0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
3df0: 64 20 73 63 68 65 6d 61 49 73 56 61 6c 69 64 28  d schemaIsValid(
3e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
3e10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3e20: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
3e30: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 72 63 3b  t iDb;.  int rc;
3e40: 0a 20 20 69 6e 74 20 63 6f 6f 6b 69 65 3b 0a 0a  .  int cookie;..
3e50: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
3e60: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 29 3b  ->checkSchema );
3e70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3e80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
3e90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3ea0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
3eb0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
3ec0: 20 20 69 6e 74 20 6f 70 65 6e 65 64 54 72 61 6e    int openedTran
3ed0: 73 61 63 74 69 6f 6e 20 3d 20 30 3b 20 20 20 20  saction = 0;    
3ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3ef0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
3f00: 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 42   opened */.    B
3f10: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
3f20: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 20 20 20  aDb[iDb].pBt;   
3f30: 20 20 2f 2a 20 42 74 72 65 65 20 64 61 74 61 62    /* Btree datab
3f40: 61 73 65 20 74 6f 20 72 65 61 64 20 63 6f 6f 6b  ase to read cook
3f50: 69 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 69  ie from */.    i
3f60: 66 28 20 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74  f( pBt==0 ) cont
3f70: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  inue;..    /* If
3f80: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
3f90: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6f 6e 6c  ready a read-onl
3fa0: 79 20 28 6f 72 20 72 65 61 64 2d 77 72 69 74 65  y (or read-write
3fb0: 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  ) transaction op
3fc0: 65 6e 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ened.    ** on t
3fd0: 68 65 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  he b-tree databa
3fe0: 73 65 2c 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77  se, open one now
3ff0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
4000: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20 69 74  on is opened, it
4010: 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
4020: 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74   closed immediat
4030: 65 6c 79 20 61 66 74 65 72 20 72 65 61 64 69 6e  ely after readin
4040: 67 20 74 68 65 20 6d 65 74 61 2d 76 61 6c 75 65  g the meta-value
4050: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71  . */.    if( !sq
4060: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65  lite3BtreeIsInRe
4070: 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  adTrans(pBt) ){.
4080: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4090: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
40a0: 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
40b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
40c0: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d  TE_NOMEM || rc==
40d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
40e0: 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  EM ){.        sq
40f0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
4100: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4110: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4120: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  OK ) return;.   
4130: 20 20 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63     openedTransac
4140: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tion = 1;.    }.
4150: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
4160: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66   schema cookie f
4170: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4180: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
4190: 20 6d 61 74 63 68 20 74 68 65 20 0a 20 20 20 20   match the .    
41a0: 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ** value stored 
41b0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  as part of the i
41c0: 6e 2d 6d 65 6d 6f 72 79 20 73 63 68 65 6d 61 20  n-memory schema 
41d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 0a  representation,.
41e0: 20 20 20 20 2a 2a 20 73 65 74 20 50 61 72 73 65      ** set Parse
41f0: 2e 72 63 20 74 6f 20 53 51 4c 49 54 45 5f 53 43  .rc to SQLITE_SC
4200: 48 45 4d 41 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  HEMA. */.    sql
4210: 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
4220: 28 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45  (pBt, BTREE_SCHE
4230: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32  MA_VERSION, (u32
4240: 20 2a 29 26 63 6f 6f 6b 69 65 29 3b 0a 20 20 20   *)&cookie);.   
4250: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4260: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4270: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
4280: 20 20 20 69 66 28 20 63 6f 6f 6b 69 65 21 3d 64     if( cookie!=d
4290: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
42a0: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
42b0: 69 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ie ){.      sqli
42c0: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
42d0: 61 28 64 62 2c 20 69 44 62 29 3b 0a 20 20 20 20  a(db, iDb);.    
42e0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
42f0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20  QLITE_SCHEMA;.  
4300: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73    }..    /* Clos
4310: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
4320: 6e 2c 20 69 66 20 6f 6e 65 20 77 61 73 20 6f 70  n, if one was op
4330: 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ened. */.    if(
4340: 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69   openedTransacti
4350: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  on ){.      sqli
4360: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
4370: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
4380: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
4390: 61 20 73 63 68 65 6d 61 20 70 6f 69 6e 74 65 72  a schema pointer
43a0: 20 69 6e 74 6f 20 74 68 65 20 69 44 62 20 69 6e   into the iDb in
43b0: 64 65 78 20 74 68 61 74 20 69 6e 64 69 63 61 74  dex that indicat
43c0: 65 73 0a 2a 2a 20 77 68 69 63 68 20 64 61 74 61  es.** which data
43d0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 64 62 2d  base file in db-
43e0: 3e 61 44 62 5b 5d 20 74 68 65 20 73 63 68 65 6d  >aDb[] the schem
43f0: 61 20 72 65 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a  a refers to..**.
4400: 2a 2a 20 49 66 20 74 68 65 20 73 61 6d 65 20 64  ** If the same d
4410: 61 74 61 62 61 73 65 20 69 73 20 61 74 74 61 63  atabase is attac
4420: 68 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  hed more than on
4430: 63 65 2c 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ce, the first.**
4440: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
4450: 73 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  se is returned..
4460: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 63  */.int sqlite3Sc
4470: 68 65 6d 61 54 6f 49 6e 64 65 78 28 73 71 6c 69  hemaToIndex(sqli
4480: 74 65 33 20 2a 64 62 2c 20 53 63 68 65 6d 61 20  te3 *db, Schema 
4490: 2a 70 53 63 68 65 6d 61 29 7b 0a 20 20 69 6e 74  *pSchema){.  int
44a0: 20 69 20 3d 20 2d 31 30 30 30 30 30 30 3b 0a 0a   i = -1000000;..
44b0: 20 20 2f 2a 20 49 66 20 70 53 63 68 65 6d 61 20    /* If pSchema 
44c0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65  is NULL, then re
44d0: 74 75 72 6e 20 2d 31 30 30 30 30 30 30 2e 20 54  turn -1000000. T
44e0: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
44f0: 20 63 6f 64 65 20 69 6e 20 0a 20 20 2a 2a 20 65   code in .  ** e
4500: 78 70 72 2e 63 20 69 73 20 74 72 79 69 6e 67 20  xpr.c is trying 
4510: 74 6f 20 72 65 73 6f 6c 76 65 20 61 20 72 65 66  to resolve a ref
4520: 65 72 65 6e 63 65 20 74 6f 20 61 20 74 72 61 6e  erence to a tran
4530: 73 69 65 6e 74 20 74 61 62 6c 65 20 28 69 2e 65  sient table (i.e
4540: 2e 20 6f 6e 65 0a 20 20 2a 2a 20 63 72 65 61 74  . one.  ** creat
4550: 65 64 20 62 79 20 61 20 73 75 62 2d 73 65 6c 65  ed by a sub-sele
4560: 63 74 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ct). In this cas
4570: 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
4580: 75 65 20 6f 66 20 74 68 69 73 20 0a 20 20 2a 2a  ue of this .  **
4590: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
45a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 0a   never be used..
45b0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 72 65 74    **.  ** We ret
45c0: 75 72 6e 20 2d 31 30 30 30 30 30 30 20 69 6e 73  urn -1000000 ins
45d0: 74 65 61 64 20 6f 66 20 74 68 65 20 6d 6f 72 65  tead of the more
45e0: 20 75 73 75 61 6c 20 2d 31 20 73 69 6d 70 6c 79   usual -1 simply
45f0: 20 62 65 63 61 75 73 65 20 75 73 69 6e 67 0a 20   because using. 
4600: 20 2a 2a 20 2d 31 30 30 30 30 30 30 20 61 73 20   ** -1000000 as 
4610: 74 68 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e  the incorrect in
4620: 64 65 78 20 69 6e 74 6f 20 64 62 2d 3e 61 44 62  dex into db->aDb
4630: 5b 5d 20 69 73 20 6d 75 63 68 20 0a 20 20 2a 2a  [] is much .  **
4640: 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20   more likely to 
4650: 63 61 75 73 65 20 61 20 73 65 67 66 61 75 6c 74  cause a segfault
4660: 20 74 68 61 6e 20 2d 31 20 28 6f 66 20 63 6f 75   than -1 (of cou
4670: 72 73 65 20 74 68 65 72 65 20 61 72 65 20 61 73  rse there are as
4680: 73 65 72 74 28 29 0a 20 20 2a 2a 20 73 74 61 74  sert().  ** stat
4690: 65 6d 65 6e 74 73 20 74 6f 6f 2c 20 62 75 74 20  ements too, but 
46a0: 69 74 20 6e 65 76 65 72 20 68 75 72 74 73 20 74  it never hurts t
46b0: 6f 20 70 6c 61 79 20 74 68 65 20 6f 64 64 73 29  o play the odds)
46c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
46d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
46e0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
46f0: 3b 0a 20 20 69 66 28 20 70 53 63 68 65 6d 61 20  ;.  if( pSchema 
4700: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4710: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  1; i++){.      a
4720: 73 73 65 72 74 28 20 69 3c 64 62 2d 3e 6e 44 62  ssert( i<db->nDb
4730: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62   );.      if( db
4740: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
4750: 3d 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ==pSchema ){.   
4760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4770: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
4780: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4790: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7d 0a 20  db->nDb );.  }. 
47a0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
47b0: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
47c0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
47d0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 6f 62  in the pParse ob
47e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
47f0: 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74 28  ite3ParserReset(
4800: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
4810: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4820: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71  pParse->db;.  sq
4830: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4840: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
4850: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4860: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 50 61  stDelete(db, pPa
4870: 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29  rse->pConstExpr)
4880: 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  ;.  if( db ){.  
4890: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
48a0: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
48b0: 20 3e 3d 20 70 50 61 72 73 65 2d 3e 64 69 73 61   >= pParse->disa
48c0: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 29 3b 0a  bleLookaside );.
48d0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
48e0: 65 2e 62 44 69 73 61 62 6c 65 20 2d 3d 20 70 50  e.bDisable -= pP
48f0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f  arse->disableLoo
4900: 6b 61 73 69 64 65 3b 0a 20 20 7d 0a 20 20 70 50  kaside;.  }.  pP
4910: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f  arse->disableLoo
4920: 6b 61 73 69 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  kaside = 0;.}../
4930: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65  *.** Compile the
4940: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53   UTF-8 encoded S
4950: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a 53 71  QL statement zSq
4960: 6c 20 69 6e 74 6f 20 61 20 73 74 61 74 65 6d 65  l into a stateme
4970: 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
4980: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4990: 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Prepare(.  sqlit
49a0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
49b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
49c0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f   handle. */.  co
49d0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
49e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38          /* UTF-8
49f0: 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61   encoded SQL sta
4a00: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74  tement. */.  int
4a10: 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20 20   nBytes,        
4a20: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4a30: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
4a40: 73 2e 20 2a 2f 0a 20 20 75 33 32 20 70 72 65 70  s. */.  u32 prep
4a50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
4a60: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
4a70: 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45  e SQLITE_PREPARE
4a80: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 56 64  _* flags */.  Vd
4a90: 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 2c 20  be *pReprepare, 
4aa0: 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65          /* VM be
4ab0: 69 6e 67 20 72 65 70 72 65 70 61 72 65 64 20 2a  ing reprepared *
4ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
4ad0: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
4ae0: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
4af0: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
4b00: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
4b10: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
4b20: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
4b30: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
4b40: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 68  tring */.){.  ch
4b50: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
4b60: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
4b70: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e   message */.  in
4b80: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4b90: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
4ba0: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  t code */.  int 
4bb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
4bd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 61 72 73 65  unter */.  Parse
4be0: 20 73 50 61 72 73 65 3b 20 20 20 20 20 20 20 20   sParse;        
4bf0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4c00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20 20 6d 65  context */..  me
4c10: 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c  mset(&sParse, 0,
4c20: 20 50 41 52 53 45 5f 48 44 52 5f 53 5a 29 3b 0a   PARSE_HDR_SZ);.
4c30: 20 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54    memset(PARSE_T
4c40: 41 49 4c 28 26 73 50 61 72 73 65 29 2c 20 30 2c  AIL(&sParse), 0,
4c50: 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b   PARSE_TAIL_SZ);
4c60: 0a 20 20 73 50 61 72 73 65 2e 70 52 65 70 72 65  .  sParse.pRepre
4c70: 70 61 72 65 20 3d 20 70 52 65 70 72 65 70 61 72  pare = pReprepar
4c80: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 53  e;.  assert( ppS
4c90: 74 6d 74 20 26 26 20 2a 70 70 53 74 6d 74 3d 3d  tmt && *ppStmt==
4ca0: 30 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74  0 );.  /* assert
4cb0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
4cc0: 6c 65 64 20 29 3b 20 2f 2f 20 6e 6f 74 20 74 72  led ); // not tr
4cd0: 75 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 55  ue with SQLITE_U
4ce0: 53 45 5f 41 4c 4c 4f 43 41 20 2a 2f 0a 20 20 61  SE_ALLOCA */.  a
4cf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4d00: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
4d10: 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 6f  tex) );..  /* Fo
4d20: 72 20 61 20 6c 6f 6e 67 2d 74 65 72 6d 20 75 73  r a long-term us
4d30: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
4d40: 6d 65 6e 74 20 61 76 6f 69 64 20 74 68 65 20 75  ment avoid the u
4d50: 73 65 20 6f 66 0a 20 20 2a 2a 20 6c 6f 6f 6b 61  se of.  ** looka
4d60: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a  side memory..  *
4d70: 2f 0a 20 20 69 66 28 20 70 72 65 70 46 6c 61 67  /.  if( prepFlag
4d80: 73 20 26 20 53 51 4c 49 54 45 5f 50 52 45 50 41  s & SQLITE_PREPA
4d90: 52 45 5f 50 45 52 53 49 53 54 45 4e 54 20 29 7b  RE_PERSISTENT ){
4da0: 0a 20 20 20 20 73 50 61 72 73 65 2e 64 69 73 61  .    sParse.disa
4db0: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 2b 2b 3b 0a  bleLookaside++;.
4dc0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4dd0: 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20 20  e.bDisable++;.  
4de0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
4df0: 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74 20   verify that it 
4e00: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67  is possible to g
4e10: 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  et a read lock o
4e20: 6e 20 61 6c 6c 0a 20 20 2a 2a 20 64 61 74 61 62  n all.  ** datab
4e30: 61 73 65 20 73 63 68 65 6d 61 73 2e 20 20 54 68  ase schemas.  Th
4e40: 65 20 69 6e 61 62 69 6c 69 74 79 20 74 6f 20 67  e inability to g
4e50: 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  et a read lock i
4e60: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 20 20  ndicates that.  
4e70: 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 61  ** some other da
4e80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4e90: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 77  n is holding a w
4ea0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 77 68 69 63 68  rite-lock, which
4eb0: 20 69 6e 0a 20 20 2a 2a 20 74 75 72 6e 20 6d 65   in.  ** turn me
4ec0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  ans that the oth
4ed0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
4ee0: 73 20 6d 61 64 65 20 75 6e 63 6f 6d 6d 69 74 74  s made uncommitt
4ef0: 65 64 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ed changes.  ** 
4f00: 74 6f 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 20  to the schema.. 
4f10: 20 2a 2a 0a 20 20 2a 2a 20 57 65 72 65 20 77 65   **.  ** Were we
4f20: 20 74 6f 20 70 72 6f 63 65 65 64 20 61 6e 64 20   to proceed and 
4f30: 70 72 65 70 61 72 65 20 74 68 65 20 73 74 61 74  prepare the stat
4f40: 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 74 68  ement against th
4f50: 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a 20 20  e uncommitted.  
4f60: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
4f70: 73 20 61 6e 64 20 69 66 20 74 68 6f 73 65 20 73  s and if those s
4f80: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
4f90: 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 72  e subsequently r
4fa0: 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 20  olled.  ** back 
4fb0: 61 6e 64 20 64 69 66 66 65 72 65 6e 74 20 63 68  and different ch
4fc0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
4fd0: 6e 20 74 68 65 69 72 20 70 6c 61 63 65 2c 20 74  n their place, t
4fe0: 68 65 6e 20 77 68 65 6e 20 74 68 69 73 0a 20 20  hen when this.  
4ff0: 2a 2a 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ** prepared stat
5000: 65 6d 65 6e 74 20 67 6f 65 73 20 74 6f 20 72 75  ement goes to ru
5010: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  n the schema coo
5020: 6b 69 65 20 77 6f 75 6c 64 20 66 61 69 6c 20 74  kie would fail t
5030: 6f 20 64 65 74 65 63 74 0a 20 20 2a 2a 20 74 68  o detect.  ** th
5040: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e  e schema change.
5050: 20 20 44 69 73 61 73 74 65 72 20 77 6f 75 6c 64    Disaster would
5060: 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2a 0a 20 20   follow..  **.  
5070: 2a 2a 20 54 68 69 73 20 74 68 72 65 61 64 20 69  ** This thread i
5080: 73 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64  s currently hold
5090: 69 6e 67 20 6d 75 74 65 78 65 73 20 6f 6e 20 61  ing mutexes on a
50a0: 6c 6c 20 42 74 72 65 65 73 20 28 62 65 63 61 75  ll Btrees (becau
50b0: 73 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  se.  ** of the s
50c0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
50d0: 41 6c 6c 28 29 20 69 6e 20 73 71 6c 69 74 65 33  All() in sqlite3
50e0: 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 29  LockAndPrepare()
50f0: 29 20 73 6f 20 69 74 0a 20 20 2a 2a 20 69 73 20  ) so it.  ** is 
5100: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
5110: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
5120: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
5130: 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 20 20 2a  chema change.  *
5140: 2a 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75  * while this rou
5150: 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2e  tine is running.
5160: 20 20 48 65 6e 63 65 2c 20 77 65 20 64 6f 20 6e    Hence, we do n
5170: 6f 74 20 6e 65 65 64 20 74 6f 20 68 6f 6c 64 20  ot need to hold 
5180: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  .  ** locks on t
5190: 68 65 20 73 63 68 65 6d 61 2c 20 77 65 20 6a 75  he schema, we ju
51a0: 73 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  st need to make 
51b0: 73 75 72 65 20 6e 6f 62 6f 64 79 20 65 6c 73 65  sure nobody else
51c0: 20 69 73 20 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   is .  ** holdin
51d0: 67 20 74 68 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  g them..  **.  *
51e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 73 65 74 74  * Note that sett
51f0: 69 6e 67 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  ing READ_UNCOMMI
5200: 54 54 45 44 20 6f 76 65 72 72 69 64 65 73 20 6d  TTED overrides m
5210: 6f 73 74 20 6c 6f 63 6b 20 64 65 74 65 63 74 69  ost lock detecti
5220: 6f 6e 2c 0a 20 20 2a 2a 20 62 75 74 20 69 74 20  on,.  ** but it 
5230: 64 6f 65 73 20 2a 6e 6f 74 2a 20 6f 76 65 72 72  does *not* overr
5240: 69 64 65 20 73 63 68 65 6d 61 20 6c 6f 63 6b 20  ide schema lock 
5250: 64 65 74 65 63 74 69 6f 6e 2c 20 73 6f 20 74 68  detection, so th
5260: 69 73 20 61 6c 6c 20 73 74 69 6c 6c 0a 20 20 2a  is all still.  *
5270: 2a 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  * works even if 
5280: 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
5290: 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
52a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
52b0: 44 62 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 42  Db; i++) {.    B
52c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
52d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
52e0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
52f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5300: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
5310: 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
5320: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
5330: 63 68 65 6d 61 4c 6f 63 6b 65 64 28 70 42 74 29  chemaLocked(pBt)
5340: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
5350: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
5360: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
5370: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3b  aDb[i].zDbSName;
5380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5390: 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
53a0: 20 72 63 2c 20 22 64 61 74 61 62 61 73 65 20 73   rc, "database s
53b0: 63 68 65 6d 61 20 69 73 20 6c 6f 63 6b 65 64 3a  chema is locked:
53c0: 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 20 20   %s", zDb);.    
53d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
53e0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
53f0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 20 29 3b  _ReadUncommit );
5400: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
5410: 64 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20 20  d_prepare;.     
5420: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
5430: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
5440: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 73 50  kList(db);..  sP
5450: 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20 20  arse.db = db;.  
5460: 69 66 28 20 6e 42 79 74 65 73 3e 3d 30 20 26 26  if( nBytes>=0 &&
5470: 20 28 6e 42 79 74 65 73 3d 3d 30 20 7c 7c 20 7a   (nBytes==0 || z
5480: 53 71 6c 5b 6e 42 79 74 65 73 2d 31 5d 21 3d 30  Sql[nBytes-1]!=0
5490: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
54a0: 53 71 6c 43 6f 70 79 3b 0a 20 20 20 20 69 6e 74  SqlCopy;.    int
54b0: 20 6d 78 4c 65 6e 20 3d 20 64 62 2d 3e 61 4c 69   mxLen = db->aLi
54c0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
54d0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20  _SQL_LENGTH];.  
54e0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74    testcase( nByt
54f0: 65 73 3d 3d 6d 78 4c 65 6e 20 29 3b 0a 20 20 20  es==mxLen );.   
5500: 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65   testcase( nByte
5510: 73 3d 3d 6d 78 4c 65 6e 2b 31 20 29 3b 0a 20 20  s==mxLen+1 );.  
5520: 20 20 69 66 28 20 6e 42 79 74 65 73 3e 6d 78 4c    if( nBytes>mxL
5530: 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  en ){.      sqli
5540: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
5550: 64 62 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  db, SQLITE_TOOBI
5560: 47 2c 20 22 73 74 61 74 65 6d 65 6e 74 20 74 6f  G, "statement to
5570: 6f 20 6c 6f 6e 67 22 29 3b 0a 20 20 20 20 20 20  o long");.      
5580: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
5590: 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  xit(db, SQLITE_T
55a0: 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20 20 67 6f  OOBIG);.      go
55b0: 74 6f 20 65 6e 64 5f 70 72 65 70 61 72 65 3b 0a  to end_prepare;.
55c0: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 43 6f      }.    zSqlCo
55d0: 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  py = sqlite3DbSt
55e0: 72 4e 44 75 70 28 64 62 2c 20 7a 53 71 6c 2c 20  rNDup(db, zSql, 
55f0: 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69 66 28  nBytes);.    if(
5600: 20 7a 53 71 6c 43 6f 70 79 20 29 7b 0a 20 20 20   zSqlCopy ){.   
5610: 20 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72     sqlite3RunPar
5620: 73 65 72 28 26 73 50 61 72 73 65 2c 20 7a 53 71  ser(&sParse, zSq
5630: 6c 43 6f 70 79 2c 20 26 7a 45 72 72 4d 73 67 29  lCopy, &zErrMsg)
5640: 3b 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e 7a  ;.      sParse.z
5650: 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 73 50 61  Tail = &zSql[sPa
5660: 72 73 65 2e 7a 54 61 69 6c 2d 7a 53 71 6c 43 6f  rse.zTail-zSqlCo
5670: 70 79 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  py];.      sqlit
5680: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
5690: 6c 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73  lCopy);.    }els
56a0: 65 7b 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e  e{.      sParse.
56b0: 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 6e 42  zTail = &zSql[nB
56c0: 79 74 65 73 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ytes];.    }.  }
56d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
56e0: 33 52 75 6e 50 61 72 73 65 72 28 26 73 50 61 72  3RunParser(&sPar
56f0: 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d  se, zSql, &zErrM
5700: 73 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  sg);.  }.  asser
5710: 74 28 20 30 3d 3d 73 50 61 72 73 65 2e 6e 51 75  t( 0==sParse.nQu
5720: 65 72 79 4c 6f 6f 70 20 29 3b 0a 0a 20 20 69 66  eryLoop );..  if
5730: 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c  ( sParse.rc==SQL
5740: 49 54 45 5f 44 4f 4e 45 20 29 20 73 50 61 72 73  ITE_DONE ) sPars
5750: 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  e.rc = SQLITE_OK
5760: 3b 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e 63  ;.  if( sParse.c
5770: 68 65 63 6b 53 63 68 65 6d 61 20 29 7b 0a 20 20  heckSchema ){.  
5780: 20 20 73 63 68 65 6d 61 49 73 56 61 6c 69 64 28    schemaIsValid(
5790: 26 73 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  &sParse);.  }.  
57a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
57b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 50 61 72  iled ){.    sPar
57c0: 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  se.rc = SQLITE_N
57d0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
57e0: 20 69 66 28 20 70 7a 54 61 69 6c 20 29 7b 0a 20   if( pzTail ){. 
57f0: 20 20 20 2a 70 7a 54 61 69 6c 20 3d 20 73 50 61     *pzTail = sPa
5800: 72 73 65 2e 7a 54 61 69 6c 3b 0a 20 20 7d 0a 20  rse.zTail;.  }. 
5810: 20 72 63 20 3d 20 73 50 61 72 73 65 2e 72 63 3b   rc = sParse.rc;
5820: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5830: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
5840: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5850: 4b 20 26 26 20 73 50 61 72 73 65 2e 70 56 64 62  K && sParse.pVdb
5860: 65 20 26 26 20 73 50 61 72 73 65 2e 65 78 70 6c  e && sParse.expl
5870: 61 69 6e 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ain ){.    stati
5880: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
5890: 6f 6e 73 74 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d  onst azColName[]
58a0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 22 61 64 64   = {.       "add
58b0: 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70  r", "opcode", "p
58c0: 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20  1", "p2", "p3", 
58d0: 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d  "p4", "p5", "com
58e0: 6d 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 22 69  ment",.       "i
58f0: 64 22 2c 20 22 70 61 72 65 6e 74 22 2c 20 22 6e  d", "parent", "n
5900: 6f 74 75 73 65 64 22 2c 20 22 64 65 74 61 69 6c  otused", "detail
5910: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
5920: 20 69 46 69 72 73 74 2c 20 6d 78 3b 0a 20 20 20   iFirst, mx;.   
5930: 20 69 66 28 20 73 50 61 72 73 65 2e 65 78 70 6c   if( sParse.expl
5940: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ain==2 ){.      
5950: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
5960: 6d 43 6f 6c 73 28 73 50 61 72 73 65 2e 70 56 64  mCols(sParse.pVd
5970: 62 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 46  be, 4);.      iF
5980: 69 72 73 74 20 3d 20 38 3b 0a 20 20 20 20 20 20  irst = 8;.      
5990: 6d 78 20 3d 20 31 32 3b 0a 20 20 20 20 7d 65 6c  mx = 12;.    }el
59a0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
59b0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
59c0: 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20 38 29  sParse.pVdbe, 8)
59d0: 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74 20 3d  ;.      iFirst =
59e0: 20 30 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20 38   0;.      mx = 8
59f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
5a00: 69 3d 69 46 69 72 73 74 3b 20 69 3c 6d 78 3b 20  i=iFirst; i<mx; 
5a10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
5a20: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
5a30: 65 28 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20  e(sParse.pVdbe, 
5a40: 69 2d 69 46 69 72 73 74 2c 20 43 4f 4c 4e 41 4d  i-iFirst, COLNAM
5a50: 45 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20 20  E_NAME,.        
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 20 20 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d      azColName[i]
5a80: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
5a90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
5aa0: 69 66 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  if..  if( db->in
5ab0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
5ac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
5ad0: 53 71 6c 28 73 50 61 72 73 65 2e 70 56 64 62 65  Sql(sParse.pVdbe
5ae0: 2c 20 7a 53 71 6c 2c 20 28 69 6e 74 29 28 73 50  , zSql, (int)(sP
5af0: 61 72 73 65 2e 7a 54 61 69 6c 2d 7a 53 71 6c 29  arse.zTail-zSql)
5b00: 2c 20 70 72 65 70 46 6c 61 67 73 29 3b 0a 20 20  , prepFlags);.  
5b10: 7d 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e 70  }.  if( sParse.p
5b20: 56 64 62 65 20 26 26 20 28 72 63 21 3d 53 51 4c  Vdbe && (rc!=SQL
5b30: 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e 6d 61  ITE_OK || db->ma
5b40: 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
5b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69     sqlite3VdbeFi
5b60: 6e 61 6c 69 7a 65 28 73 50 61 72 73 65 2e 70 56  nalize(sParse.pV
5b70: 64 62 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dbe);.    assert
5b80: 28 21 28 2a 70 70 53 74 6d 74 29 29 3b 0a 20 20  (!(*ppStmt));.  
5b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 53 74  }else{.    *ppSt
5ba0: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
5bb0: 6d 74 2a 29 73 50 61 72 73 65 2e 70 56 64 62 65  mt*)sParse.pVdbe
5bc0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 45 72  ;.  }..  if( zEr
5bd0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  rMsg ){.    sqli
5be0: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
5bf0: 64 62 2c 20 72 63 2c 20 22 25 73 22 2c 20 7a 45  db, rc, "%s", zE
5c00: 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
5c10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
5c20: 72 72 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrMsg);.  }else{
5c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5c40: 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 0a  r(db, rc);.  }..
5c50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
5c60: 54 72 69 67 67 65 72 50 72 67 20 73 74 72 75 63  TriggerPrg struc
5c70: 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  tures allocated 
5c80: 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 74 68  while parsing th
5c90: 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  is statement. */
5ca0: 0a 20 20 77 68 69 6c 65 28 20 73 50 61 72 73 65  .  while( sParse
5cb0: 2e 70 54 72 69 67 67 65 72 50 72 67 20 29 7b 0a  .pTriggerPrg ){.
5cc0: 20 20 20 20 54 72 69 67 67 65 72 50 72 67 20 2a      TriggerPrg *
5cd0: 70 54 20 3d 20 73 50 61 72 73 65 2e 70 54 72 69  pT = sParse.pTri
5ce0: 67 67 65 72 50 72 67 3b 0a 20 20 20 20 73 50 61  ggerPrg;.    sPa
5cf0: 72 73 65 2e 70 54 72 69 67 67 65 72 50 72 67 20  rse.pTriggerPrg 
5d00: 3d 20 70 54 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pT->pNext;.   
5d10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5d20: 62 2c 20 70 54 29 3b 0a 20 20 7d 0a 0a 65 6e 64  b, pT);.  }..end
5d30: 5f 70 72 65 70 61 72 65 3a 0a 0a 20 20 73 71 6c  _prepare:..  sql
5d40: 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74 28  ite3ParserReset(
5d50: 26 73 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  &sParse);.  retu
5d60: 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
5d70: 69 6e 74 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41  int sqlite3LockA
5d80: 6e 64 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c  ndPrepare(.  sql
5d90: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
5da0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5db0: 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20  se handle. */.  
5dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
5dd0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46  ,         /* UTF
5de0: 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  -8 encoded SQL s
5df0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
5e00: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
5e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5e20: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
5e30: 74 65 73 2e 20 2a 2f 0a 20 20 75 33 32 20 70 72  tes. */.  u32 pr
5e40: 65 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  epFlags,        
5e50: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
5e60: 6f 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41  ore SQLITE_PREPA
5e70: 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RE_* flags */.  
5e80: 56 64 62 65 20 2a 70 4f 6c 64 2c 20 20 20 20 20  Vdbe *pOld,     
5e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
5ea0: 62 65 69 6e 67 20 72 65 70 72 65 70 61 72 65 64  being reprepared
5eb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
5ec0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
5ed0: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
5ee0: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
5ef0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
5f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
5f10: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
5f20: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
5f30: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
5f40: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 63 6e  int rc;.  int cn
5f50: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 52 65  t = 0;.  int bRe
5f60: 6c 65 61 73 65 53 63 68 65 6d 61 20 3d 20 30 3b  leaseSchema = 0;
5f70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5f80: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
5f90: 0a 20 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30  .  if( ppStmt==0
5fa0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5fb0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
5fc0: 6e 64 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ndif.  *ppStmt =
5fd0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
5fe0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
5ff0: 64 62 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a  db)||zSql==0 ){.
6000: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6010: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
6020: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
6030: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6040: 65 78 29 3b 0a 20 20 69 66 28 20 49 73 52 65 75  ex);.  if( IsReu
6050: 73 65 53 63 68 65 6d 61 28 64 62 29 20 29 7b 0a  seSchema(db) ){.
6060: 20 20 20 20 69 66 28 20 28 64 62 2d 3e 6d 44 62      if( (db->mDb
6070: 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53  Flags & DBFLAG_S
6080: 63 68 65 6d 61 49 6e 75 73 65 29 3d 3d 30 20 29  chemaInuse)==0 )
6090: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46  {.      db->mDbF
60a0: 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
60b0: 63 68 65 6d 61 49 6e 75 73 65 3b 0a 20 20 20 20  chemaInuse;.    
60c0: 20 20 62 52 65 6c 65 61 73 65 53 63 68 65 6d 61    bReleaseSchema
60d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
60e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
60f0: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 64 6f  terAll(db);.  do
6100: 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 6d 75  {.    /* Make mu
6110: 6c 74 69 70 6c 65 20 61 74 74 65 6d 70 74 73 20  ltiple attempts 
6120: 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 53  to compile the S
6130: 51 4c 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74  QL, until it eit
6140: 68 65 72 20 73 75 63 63 65 65 64 73 0a 20 20 20  her succeeds.   
6150: 20 2a 2a 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72   ** or encounter
6160: 73 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 65 72  s a permanent er
6170: 72 6f 72 2e 20 20 41 20 73 63 68 65 6d 61 20 70  ror.  A schema p
6180: 72 6f 62 6c 65 6d 20 61 66 74 65 72 20 6f 6e 65  roblem after one
6190: 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20 72   schema.    ** r
61a0: 65 73 65 74 20 69 73 20 63 6f 6e 73 69 64 65 72  eset is consider
61b0: 65 64 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 65  ed a permanent e
61c0: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20  rror. */.    rc 
61d0: 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  = sqlite3Prepare
61e0: 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74 65  (db, zSql, nByte
61f0: 73 2c 20 70 72 65 70 46 6c 61 67 73 2c 20 70 4f  s, prepFlags, pO
6200: 6c 64 2c 20 70 70 53 74 6d 74 2c 20 70 7a 54 61  ld, ppStmt, pzTa
6210: 69 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  il);.    assert(
6220: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
6230: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  | *ppStmt==0 );.
6240: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
6250: 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59  LITE_ERROR_RETRY
6260: 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 63 3d 3d  .       || (rc==
6270: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 26 26  SQLITE_SCHEMA &&
6280: 20 28 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e   (sqlite3ResetOn
6290: 65 53 63 68 65 6d 61 28 64 62 2c 2d 31 29 2c 20  eSchema(db,-1), 
62a0: 63 6e 74 2b 2b 29 3d 3d 30 29 20 29 3b 0a 0a 20  cnt++)==0) );.. 
62b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
62c0: 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 69 66  veAll(db);..  if
62d0: 28 20 62 52 65 6c 65 61 73 65 53 63 68 65 6d 61  ( bReleaseSchema
62e0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46   ){.    db->mDbF
62f0: 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f  lags &= ~DBFLAG_
6300: 53 63 68 65 6d 61 49 6e 75 73 65 3b 0a 20 20 20  SchemaInuse;.   
6310: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 52 65   sqlite3SchemaRe
6320: 6c 65 61 73 65 41 6c 6c 28 64 62 29 3b 0a 20 20  leaseAll(db);.  
6330: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
6340: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
6350: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 72 63 26  ;.  assert( (rc&
6360: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
6370: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
6380: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6390: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
63a0: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
63b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
63c0: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  LIZE./*.** Check
63d0: 73 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  s if the specifi
63e0: 65 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 74 61  ed token is a ta
63f0: 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20  ble, column, or 
6400: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2c 0a 2a  function name,.*
6410: 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 64  * based on the d
6420: 61 74 61 62 61 73 65 73 20 61 73 73 6f 63 69 61  atabases associa
6430: 74 65 64 20 77 69 74 68 20 74 68 65 20 73 74 61  ted with the sta
6440: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 72 65  tement being pre
6450: 70 61 72 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  pared..** If the
6460: 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 73 2c   function fails,
6470: 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
6480: 64 20 61 6e 64 20 70 52 63 20 69 73 20 66 69 6c  d and pRc is fil
6490: 6c 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  led with the.** 
64a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
64b0: 74 61 74 69 63 20 69 6e 74 20 73 68 6f 75 6c 64  tatic int should
64c0: 54 72 65 61 74 41 73 49 64 65 6e 74 69 66 69 65  TreatAsIdentifie
64d0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
64e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
64f0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a  base handle. */.
6500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6510: 6f 6b 65 6e 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  oken, /* Pointer
6520: 20 74 6f 20 73 74 61 72 74 20 6f 66 20 74 6f 6b   to start of tok
6530: 65 6e 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  en to be checked
6540: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
6550: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e  ,         /* Len
6560: 67 74 68 20 6f 66 20 74 6f 6b 65 6e 20 74 6f 20  gth of token to 
6570: 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
6580: 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
6590: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
65a0: 6f 20 65 72 72 6f 72 20 63 6f 64 65 20 75 70 6f  o error code upo
65b0: 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 29 7b 0a  n failure */.){.
65c0: 20 20 69 6e 74 20 62 46 6f 75 6e 64 20 3d 20 30    int bFound = 0
65d0: 3b 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72  ;     /* Non-zer
65e0: 6f 20 69 66 20 74 6f 6b 65 6e 20 69 73 20 61 6e  o if token is an
65f0: 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
6600: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  . */.  int i, j;
6610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6620: 74 61 62 61 73 65 20 61 6e 64 20 63 6f 6c 75 6d  tabase and colum
6630: 6e 20 6c 6f 6f 70 20 69 6e 64 65 78 65 73 2e 20  n loop indexes. 
6640: 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63  */.  Schema *pSc
6650: 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65  hema;    /* Sche
6660: 6d 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64  ma for current d
6670: 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 48 61  atabase. */.  Ha
6680: 73 68 20 2a 70 48 61 73 68 3b 20 20 20 20 20 20  sh *pHash;      
6690: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
66a0: 6f 66 20 74 61 62 6c 65 73 20 66 6f 72 20 63 75  of tables for cu
66b0: 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 2e 20  rrent database. 
66c0: 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 65  */.  HashElem *e
66d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68  ;        /* Hash
66e0: 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 68 61 73   element for has
66f0: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 69 6f  h table iteratio
6700: 6e 2e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  n. */.  Table *p
6710: 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  Tab;        /* D
6720: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 66 6f  atabase table fo
6730: 72 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67 20  r columns being 
6740: 63 68 65 63 6b 65 64 2e 20 2a 2f 0a 0a 20 20 69  checked. */..  i
6750: 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  f( sqlite3IsRowi
6760: 64 4e 28 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  dN(zToken, nToke
6770: 6e 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  n) ){.    return
6780: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54   1;.  }.  if( nT
6790: 6f 6b 65 6e 3e 30 20 29 7b 0a 20 20 20 20 69 6e  oken>0 ){.    in
67a0: 74 20 68 61 73 68 20 3d 20 53 51 4c 49 54 45 5f  t hash = SQLITE_
67b0: 46 55 4e 43 5f 48 41 53 48 28 73 71 6c 69 74 65  FUNC_HASH(sqlite
67c0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 75  3UpperToLower[(u
67d0: 38 29 7a 54 6f 6b 65 6e 5b 30 5d 5d 2c 20 6e 54  8)zToken[0]], nT
67e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 73  oken);.    if( s
67f0: 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 53 65  qlite3FunctionSe
6800: 61 72 63 68 4e 28 68 61 73 68 2c 20 7a 54 6f 6b  archN(hash, zTok
6810: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 72 65  en, nToken) ) re
6820: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
6830: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
6840: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6850: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
6860: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
6870: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
6880: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6890: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 48 61  b; i++){.    pHa
68a0: 73 68 20 3d 20 26 64 62 2d 3e 61 46 75 6e 63 3b  sh = &db->aFunc;
68b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
68c0: 48 61 73 68 46 69 6e 64 4e 28 70 48 61 73 68 2c  HashFindN(pHash,
68d0: 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   zToken, nToken)
68e0: 20 29 7b 0a 20 20 20 20 20 20 62 46 6f 75 6e 64   ){.      bFound
68f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
6900: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  k;.    }.    pSc
6910: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
6920: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69  ].pSchema;.    i
6930: 66 28 20 70 53 63 68 65 6d 61 3d 3d 30 20 29 20  f( pSchema==0 ) 
6940: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 48  continue;.    pH
6950: 61 73 68 20 3d 20 26 70 53 63 68 65 6d 61 2d 3e  ash = &pSchema->
6960: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 69 66 28  tblHash;.    if(
6970: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
6980: 4e 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c  N(pHash, zToken,
6990: 20 6e 54 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20   nToken) ){.    
69a0: 20 20 62 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20    bFound = 1;.  
69b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69c0: 0a 20 20 20 20 66 6f 72 28 65 3d 73 71 6c 69 74  .    for(e=sqlit
69d0: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
69e0: 29 3b 20 65 3b 20 65 3d 73 71 6c 69 74 65 48 61  ); e; e=sqliteHa
69f0: 73 68 4e 65 78 74 28 65 29 29 7b 0a 20 20 20 20  shNext(e)){.    
6a00: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48    pTab = sqliteH
6a10: 61 73 68 44 61 74 61 28 65 29 3b 0a 20 20 20 20  ashData(e);.    
6a20: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
6a30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6a40: 70 48 61 73 68 20 3d 20 70 54 61 62 2d 3e 70 43  pHash = pTab->pC
6a50: 6f 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 69 66  olHash;.      if
6a60: 28 20 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ( pHash==0 ){.  
6a70: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 43 6f 6c        pTab->pCol
6a80: 48 61 73 68 20 3d 20 70 48 61 73 68 20 3d 20 73  Hash = pHash = s
6a90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
6aa0: 7a 65 6f 66 28 48 61 73 68 29 29 3b 0a 20 20 20  zeof(Hash));.   
6ab0: 20 20 20 20 20 69 66 28 20 70 48 61 73 68 20 29       if( pHash )
6ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6ad0: 74 65 33 48 61 73 68 49 6e 69 74 28 70 48 61 73  te3HashInit(pHas
6ae0: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  h);.          fo
6af0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
6b00: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
6b10: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
6b20: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
6b30: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[j];.          
6b40: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
6b50: 65 72 74 28 70 48 61 73 68 2c 20 70 43 6f 6c 2d  ert(pHash, pCol-
6b60: 3e 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3b 0a 20  >zName, pCol);. 
6b70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6b90: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
6ba0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
6bb0: 20 20 20 20 20 20 20 20 62 46 6f 75 6e 64 20 3d          bFound =
6bc0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
6bd0: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20  to done;.       
6be0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6bf0: 20 69 66 28 20 70 48 61 73 68 20 26 26 20 73 71   if( pHash && sq
6c00: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 4e 28 70  lite3HashFindN(p
6c10: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6c20: 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  oken) ){.       
6c30: 20 62 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20   bFound = 1;.   
6c40: 20 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a       goto done;.
6c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6c60: 7d 0a 64 6f 6e 65 3a 0a 20 20 73 71 6c 69 74 65  }.done:.  sqlite
6c70: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
6c80: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  b);.  sqlite3_mu
6c90: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6ca0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
6cb0: 46 6f 75 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Found;.}../*.** 
6cc0: 41 74 74 65 6d 70 74 20 74 6f 20 65 73 74 69 6d  Attempt to estim
6cd0: 61 74 65 20 74 68 65 20 66 69 6e 61 6c 20 6f 75  ate the final ou
6ce0: 74 70 75 74 20 62 75 66 66 65 72 20 73 69 7a 65  tput buffer size
6cf0: 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20   needed for the 
6d00: 66 75 6c 6c 79 0a 2a 2a 20 6e 6f 72 6d 61 6c 69  fully.** normali
6d10: 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
6d20: 68 65 20 73 70 65 63 69 66 69 65 64 20 53 51 4c  he specified SQL
6d30: 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 73   string.  This s
6d40: 68 6f 75 6c 64 20 74 61 6b 65 20 69 6e 74 6f 0a  hould take into.
6d50: 2a 2a 20 61 63 63 6f 75 6e 74 20 61 6e 79 20 70  ** account any p
6d60: 6f 74 65 6e 74 69 61 6c 20 65 78 70 61 6e 73 69  otential expansi
6d70: 6f 6e 20 74 68 61 74 20 63 6f 75 6c 64 20 6f 63  on that could oc
6d80: 63 75 72 20 28 65 2e 67 2e 20 76 69 61 20 49 4e  cur (e.g. via IN
6d90: 20 63 6c 61 75 73 65 73 0a 2a 2a 20 62 65 69 6e   clauses.** bein
6da0: 67 20 65 78 70 61 6e 64 65 64 2c 20 65 74 63 29  g expanded, etc)
6db0: 2e 20 20 54 68 69 73 20 73 69 7a 65 20 72 65 74  .  This size ret
6dc0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 74 6f 74  urned is the tot
6dd0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
6de0: 65 73 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  es.** including 
6df0: 74 68 65 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74  the NUL terminat
6e00: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
6e10: 74 20 65 73 74 69 6d 61 74 65 4e 6f 72 6d 61 6c  t estimateNormal
6e20: 69 7a 65 64 53 69 7a 65 28 0a 20 20 63 6f 6e 73  izedSize(.  cons
6e30: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a  t char *zSql, /*
6e40: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   The original SQ
6e50: 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  L string */.  in
6e60: 74 20 6e 53 71 6c 2c 20 20 20 20 20 20 20 20 20  t nSql,         
6e70: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6f 72 69  /* Length of ori
6e80: 67 69 6e 61 6c 20 53 51 4c 20 73 74 72 69 6e 67  ginal SQL string
6e90: 20 2a 2f 0a 20 20 75 38 20 70 72 65 70 46 6c 61   */.  u8 prepFla
6ea0: 67 73 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  gs      /* The f
6eb0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
6ec0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6ed0: 33 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  3() */.){.  int 
6ee0: 6e 4f 75 74 20 3d 20 6e 53 71 6c 20 2b 20 34 3b  nOut = nSql + 4;
6ef0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6f00: 20 3d 20 7a 53 71 6c 3b 0a 20 20 77 68 69 6c 65   = zSql;.  while
6f10: 28 20 6e 4f 75 74 3c 6e 53 71 6c 2a 35 20 29 7b  ( nOut<nSql*5 ){
6f20: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  .    while( z[0]
6f30: 21 3d 30 20 26 26 20 7a 5b 30 5d 21 3d 27 49 27  !=0 && z[0]!='I'
6f40: 20 26 26 20 7a 5b 30 5d 21 3d 27 69 27 20 29 7b   && z[0]!='i' ){
6f50: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
6f60: 7a 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  z[0]==0 ) break;
6f70: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
6f80: 28 20 7a 5b 30 5d 21 3d 27 4e 27 20 26 26 20 7a  ( z[0]!='N' && z
6f90: 5b 30 5d 21 3d 27 6e 27 20 29 20 62 72 65 61 6b  [0]!='n' ) break
6fa0: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 77  ;.    z++;.    w
6fb0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
6fc0: 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b  pace(z[0]) ){ z+
6fd0: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 30  +; }.    if( z[0
6fe0: 5d 21 3d 27 28 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='(' ) break;.
6ff0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 4f 75      z++;.    nOu
7000: 74 20 2b 3d 20 35 3b 20 2f 2a 20 3f 2c 3f 2c 3f  t += 5; /* ?,?,?
7010: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
7020: 20 6e 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nOut;.}../*.** 
7030: 43 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74  Copy the current
7040: 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 74 68 65 20   token into the 
7050: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 77 68  output buffer wh
7060: 69 6c 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  ile dealing with
7070: 20 71 75 6f 74 65 64 0a 2a 2a 20 69 64 65 6e 74   quoted.** ident
7080: 69 66 69 65 72 73 2e 20 20 42 79 20 64 65 66 61  ifiers.  By defa
7090: 75 6c 74 2c 20 61 6c 6c 20 6c 65 74 74 65 72 73  ult, all letters
70a0: 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
70b0: 65 64 20 69 6e 74 6f 20 6c 6f 77 65 72 63 61 73  ed into lowercas
70c0: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 55 70  e..** If the bUp
70d0: 70 65 72 20 66 6c 61 67 20 69 73 20 73 65 74 2c  per flag is set,
70e0: 20 75 70 70 65 72 63 61 73 65 20 77 69 6c 6c 20   uppercase will 
70f0: 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 70 69  be used.  The pi
7100: 4f 75 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  Out argument.** 
7110: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
7120: 75 70 64 61 74 65 20 74 68 65 20 74 61 72 67 65  update the targe
7130: 74 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  t index into the
7140: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 2e 0a   output string..
7150: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
7160: 6f 70 79 4e 6f 72 6d 61 6c 69 7a 65 64 54 6f 6b  opyNormalizedTok
7170: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
7180: 20 2a 7a 53 71 6c 2c 20 2f 2a 20 54 68 65 20 6f   *zSql, /* The o
7190: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 72 69  riginal SQL stri
71a0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 2c  ng */.  int iIn,
71b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
71c0: 72 65 6e 74 20 69 6e 64 65 78 20 69 6e 74 6f 20  rent index into 
71d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
71e0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
71f0: 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 2f   nToken,       /
7200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7210: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
7220: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
7230: 74 6f 6b 65 6e 46 6c 61 67 73 2c 20 20 20 2f 2a  tokenFlags,   /*
7240: 20 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   Flags returned 
7250: 62 79 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  by the tokenizer
7260: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
7270: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
7280: 75 74 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  utput string */.
7290: 20 20 69 6e 74 20 2a 70 69 4f 75 74 20 20 20 20    int *piOut    
72a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
72b0: 6f 20 74 61 72 67 65 74 20 69 6e 64 65 78 20 69  o target index i
72c0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73  nto the output s
72d0: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
72e0: 74 20 62 51 75 6f 74 65 64 20 3d 20 74 6f 6b 65  t bQuoted = toke
72f0: 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
7300: 54 4f 4b 45 4e 5f 51 55 4f 54 45 44 3b 0a 20 20  TOKEN_QUOTED;.  
7310: 69 6e 74 20 62 4b 65 79 77 6f 72 64 20 3d 20 74  int bKeyword = t
7320: 6f 6b 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  okenFlags & SQLI
7330: 54 45 5f 54 4f 4b 45 4e 5f 4b 45 59 57 4f 52 44  TE_TOKEN_KEYWORD
7340: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 2a 70 69 4f  ;.  int j = *piO
7350: 75 74 2c 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72  ut, k = 0;.  for
7360: 28 3b 20 6b 3c 6e 54 6f 6b 65 6e 3b 20 6b 2b 2b  (; k<nToken; k++
7370: 29 7b 0a 20 20 20 20 69 66 28 20 62 51 75 6f 74  ){.    if( bQuot
7380: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ed ){.      if( 
7390: 6b 3d 3d 30 20 26 26 20 69 49 6e 3e 30 20 29 7b  k==0 && iIn>0 ){
73a0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b  .        zOut[j+
73b0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20  +] = '"';.      
73c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
73d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 6e    }else if( k==n
73e0: 54 6f 6b 65 6e 2d 31 20 29 7b 0a 20 20 20 20 20  Token-1 ){.     
73f0: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 27     zOut[j++] = '
7400: 22 27 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  "';.        cont
7410: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
7420: 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4b 65 79    }.    if( bKey
7430: 77 6f 72 64 20 29 7b 0a 20 20 20 20 20 20 7a 4f  word ){.      zO
7440: 75 74 5b 6a 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  ut[j++] = sqlite
7450: 33 54 6f 75 70 70 65 72 28 7a 53 71 6c 5b 69 49  3Toupper(zSql[iI
7460: 6e 2b 6b 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  n+k]);.    }else
7470: 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b  {.      zOut[j++
7480: 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77  ] = sqlite3Tolow
7490: 65 72 28 7a 53 71 6c 5b 69 49 6e 2b 6b 5d 29 3b  er(zSql[iIn+k]);
74a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 69  .    }.  }.  *pi
74b0: 4f 75 74 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  Out = j;.}../*.*
74c0: 2a 20 50 65 72 66 6f 72 6d 20 6e 6f 72 6d 61 6c  * Perform normal
74d0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  ization of the S
74e0: 51 4c 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  QL contained in 
74f0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
7500: 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 73 74  tement and.** st
7510: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
7520: 6e 20 74 68 65 20 7a 4e 6f 72 6d 53 71 6c 20 66  n the zNormSql f
7530: 69 65 6c 64 2e 20 20 54 68 65 20 73 63 68 65 6d  ield.  The schem
7540: 61 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69  a for the associ
7550: 61 74 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  ated.** database
7560: 73 20 61 72 65 20 63 6f 6e 73 75 6c 74 65 64 20  s are consulted 
7570: 77 68 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67  while performing
7580: 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 61 74 69   the normalizati
7590: 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  on in order to.*
75a0: 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * determine if a
75b0: 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 74   token appears t
75c0: 6f 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69  o be an identifi
75d0: 65 72 2e 20 20 41 6c 6c 20 69 64 65 6e 74 69 66  er.  All identif
75e0: 69 65 72 73 20 61 72 65 0a 2a 2a 20 6c 65 66 74  iers are.** left
75f0: 20 69 6e 74 61 63 74 20 69 6e 20 74 68 65 20 6e   intact in the n
7600: 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 61 6e  ormalized SQL an
7610: 64 20 61 6c 6c 20 6c 69 74 65 72 61 6c 73 20 61  d all literals a
7620: 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
7630: 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 27 3f 27   a.** single '?'
7640: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7650: 33 4e 6f 72 6d 61 6c 69 7a 65 28 0a 20 20 56 64  3Normalize(.  Vd
7660: 62 65 20 2a 70 56 64 62 65 2c 20 20 20 20 20 20  be *pVdbe,      
7670: 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65 70 72  /* VM being repr
7680: 65 70 61 72 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  epared */.  cons
7690: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a  t char *zSql, /*
76a0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   The original SQ
76b0: 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  L string */.  in
76c0: 74 20 6e 53 71 6c 2c 20 20 20 20 20 20 20 20 20  t nSql,         
76d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 69  /* Size of the i
76e0: 6e 70 75 74 20 73 74 72 69 6e 67 20 69 6e 20 62  nput string in b
76f0: 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 70 72 65  ytes */.  u8 pre
7700: 70 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 54  pFlags      /* T
7710: 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
7720: 74 6f 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  to sqlite3_prepa
7730: 72 65 5f 76 33 28 29 20 2a 2f 0a 29 7b 0a 20 20  re_v3() */.){.  
7740: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
7750: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7760: 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20  se handle. */.  
7770: 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
7780: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75         /* The ou
7790: 74 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  tput string */. 
77a0: 20 69 6e 74 20 6e 5a 3b 20 20 20 20 20 20 20 20   int nZ;        
77b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
77c0: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 74  of the output st
77d0: 72 69 6e 67 20 69 6e 20 62 79 74 65 73 20 2a 2f  ring in bytes */
77e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
77f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
7800: 74 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 72  t character to r
7810: 65 61 64 20 66 72 6f 6d 20 7a 53 71 6c 5b 5d 20  ead from zSql[] 
7820: 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
7830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7840: 65 78 74 20 63 68 61 72 61 63 74 65 72 20 74 6f  ext character to
7850: 20 66 69 6c 6c 20 69 6e 20 6f 6e 20 7a 5b 5d 20   fill in on z[] 
7860: 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 54 79  */.  int tokenTy
7870: 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  pe = 0;     /* T
7880: 79 70 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ype of the next 
7890: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 70  token */.  int p
78a0: 72 65 76 54 6f 6b 65 6e 54 79 70 65 20 3d 20 30  revTokenType = 0
78b0: 3b 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65  ; /* Type of the
78c0: 20 70 72 65 76 69 6f 75 73 20 74 6f 6b 65 6e 2c   previous token,
78d0: 20 65 78 63 65 70 74 20 73 70 61 63 65 73 20 2a   except spaces *
78e0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
78f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
7900: 7a 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ze of the next t
7910: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  oken */.  int nP
7920: 61 72 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aren = 0;       
7930: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 6c 65 76 65   /* Nesting leve
7940: 6c 20 6f 66 20 70 61 72 65 6e 74 68 65 73 69 73  l of parenthesis
7950: 20 2a 2f 0a 20 20 48 61 73 68 20 69 6e 48 61 73   */.  Hash inHas
7960: 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
7970: 54 61 62 6c 65 20 6f 66 20 70 61 72 65 6e 74 68  Table of parenth
7980: 65 73 69 73 20 6c 65 76 65 6c 73 20 74 6f 20 6f  esis levels to o
7990: 75 74 70 75 74 20 69 6e 64 65 78 2e 20 2a 2f 0a  utput index. */.
79a0: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 56  .  db = sqlite3V
79b0: 64 62 65 44 62 28 70 56 64 62 65 29 3b 0a 20 20  dbeDb(pVdbe);.  
79c0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
79d0: 0a 20 20 61 73 73 65 72 74 28 20 70 56 64 62 65  .  assert( pVdbe
79e0: 2d 3e 7a 4e 6f 72 6d 53 71 6c 3d 3d 30 20 29 3b  ->zNormSql==0 );
79f0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
7a00: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 5a 20 3d 20   return;.  nZ = 
7a10: 65 73 74 69 6d 61 74 65 4e 6f 72 6d 61 6c 69 7a  estimateNormaliz
7a20: 65 64 53 69 7a 65 28 7a 53 71 6c 2c 20 6e 53 71  edSize(zSql, nSq
7a30: 6c 2c 20 70 72 65 70 46 6c 61 67 73 29 3b 0a 20  l, prepFlags);. 
7a40: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   z = sqlite3DbMa
7a50: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 5a  llocRawNN(db, nZ
7a60: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
7a70: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
7a80: 33 48 61 73 68 49 6e 69 74 28 26 69 6e 48 61 73  3HashInit(&inHas
7a90: 68 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  h);.  for(i=j=0;
7aa0: 20 69 3c 6e 53 71 6c 20 26 26 20 7a 53 71 6c 5b   i<nSql && zSql[
7ab0: 69 5d 3b 20 69 2b 3d 6e 29 7b 0a 20 20 20 20 69  i]; i+=n){.    i
7ac0: 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  nt flags = 0;.  
7ad0: 20 20 69 66 28 20 74 6f 6b 65 6e 54 79 70 65 21    if( tokenType!
7ae0: 3d 54 4b 5f 53 50 41 43 45 20 29 20 70 72 65 76  =TK_SPACE ) prev
7af0: 54 6f 6b 65 6e 54 79 70 65 20 3d 20 74 6f 6b 65  TokenType = toke
7b00: 6e 54 79 70 65 3b 0a 20 20 20 20 6e 20 3d 20 73  nType;.    n = s
7b10: 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e 4e 6f  qlite3GetTokenNo
7b20: 72 6d 61 6c 69 7a 65 64 28 28 75 6e 73 69 67 6e  rmalized((unsign
7b30: 65 64 20 63 68 61 72 2a 29 7a 53 71 6c 2b 69 2c  ed char*)zSql+i,
7b40: 20 26 74 6f 6b 65 6e 54 79 70 65 2c 20 26 66 6c   &tokenType, &fl
7b50: 61 67 73 29 3b 0a 20 20 20 20 73 77 69 74 63 68  ags);.    switch
7b60: 28 20 74 6f 6b 65 6e 54 79 70 65 20 29 7b 0a 20  ( tokenType ){. 
7b70: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41       case TK_SPA
7b80: 43 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72  CE: {.        br
7b90: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
7ba0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4c 4c 45 47     case TK_ILLEG
7bb0: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AL: {.        sq
7bc0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7bd0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  z);.        sqli
7be0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 69 6e  te3HashClear(&in
7bf0: 48 61 73 68 29 3b 0a 20 20 20 20 20 20 20 20 72  Hash);.        r
7c00: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7c10: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52       case TK_STR
7c20: 49 4e 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ING:.      case 
7c30: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
7c40: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
7c50: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 56  .      case TK_V
7c60: 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 63  ARIABLE:.      c
7c70: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
7c80: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
7c90: 27 3f 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65  '?';.        bre
7ca0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7cb0: 20 20 63 61 73 65 20 54 4b 5f 4c 50 3a 0a 20 20    case TK_LP:.  
7cc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 50 3a 20      case TK_RP: 
7cd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  {.        if( to
7ce0: 6b 65 6e 54 79 70 65 3d 3d 54 4b 5f 4c 50 20 29  kenType==TK_LP )
7cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 72  {.          nPar
7d00: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
7d10: 69 66 28 20 70 72 65 76 54 6f 6b 65 6e 54 79 70  if( prevTokenTyp
7d20: 65 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  e==TK_IN ){.    
7d30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7d40: 6e 50 61 72 65 6e 3c 6e 53 71 6c 20 29 3b 0a 20  nParen<nSql );. 
7d50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7d60: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 69 6e  e3HashInsert(&in
7d70: 48 61 73 68 2c 20 7a 53 71 6c 2b 6e 50 61 72 65  Hash, zSql+nPare
7d80: 6e 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  n, SQLITE_INT_TO
7d90: 5f 50 54 52 28 6a 29 29 3b 0a 20 20 20 20 20 20  _PTR(j));.      
7da0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
7db0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
7dc0: 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20  nt jj;.         
7dd0: 20 61 73 73 65 72 74 28 20 6e 50 61 72 65 6e 3c   assert( nParen<
7de0: 6e 53 71 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nSql );.        
7df0: 20 20 6a 6a 20 3d 20 53 51 4c 49 54 45 5f 50 54    jj = SQLITE_PT
7e00: 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33  R_TO_INT(sqlite3
7e10: 48 61 73 68 46 69 6e 64 28 26 69 6e 48 61 73 68  HashFind(&inHash
7e20: 2c 20 7a 53 71 6c 2b 6e 50 61 72 65 6e 29 29 3b  , zSql+nParen));
7e30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
7e40: 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j>0 ){.         
7e50: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
7e60: 73 65 72 74 28 26 69 6e 48 61 73 68 2c 20 7a 53  sert(&inHash, zS
7e70: 71 6c 2b 6e 50 61 72 65 6e 2c 20 30 29 3b 0a 20  ql+nParen, 0);. 
7e80: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
7e90: 74 28 20 6a 6a 2b 36 3c 6e 5a 20 29 3b 0a 20 20  t( jj+6<nZ );.  
7ea0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
7eb0: 28 7a 2b 6a 6a 2b 31 2c 20 22 3f 2c 3f 2c 3f 22  (z+jj+1, "?,?,?"
7ec0: 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 5);.          
7ed0: 20 20 6a 20 3d 20 6a 6a 2b 36 3b 0a 20 20 20 20    j = jj+6;.    
7ee0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7ef0: 6e 5a 2d 31 2d 6a 3e 3d 30 20 29 3b 0a 20 20 20  nZ-1-j>=0 );.   
7f00: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
7f10: 20 6e 5a 2d 31 2d 6a 3c 6e 5a 20 29 3b 0a 20 20   nZ-1-j<nZ );.  
7f20: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
7f30: 28 7a 2b 6a 2c 20 30 2c 20 6e 5a 2d 31 2d 6a 29  (z+j, 0, nZ-1-j)
7f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7f50: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d          nParen--
7f60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7f70: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 72      assert( nPar
7f80: 65 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  en>=0 );.       
7f90: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
7fa0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
7fb0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
7fc0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53  .      case TK_S
7fd0: 45 4d 49 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EMI:.      case 
7fe0: 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 20 20 63  TK_PLUS:.      c
7ff0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
8000: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
8010: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
8020: 52 45 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  REM:.      case 
8030: 54 4b 5f 45 51 3a 0a 20 20 20 20 20 20 63 61 73  TK_EQ:.      cas
8040: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 20 20 63  e TK_LE:.      c
8050: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 20  ase TK_NE:.     
8060: 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
8070: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  .      case TK_L
8080: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  T:.      case TK
8090: 5f 52 53 48 49 46 54 3a 0a 20 20 20 20 20 20 63  _RSHIFT:.      c
80a0: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 20  ase TK_GT:.     
80b0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
80c0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
80d0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
80e0: 43 4f 4e 43 41 54 3a 0a 20 20 20 20 20 20 63 61  CONCAT:.      ca
80f0: 73 65 20 54 4b 5f 43 4f 4d 4d 41 3a 0a 20 20 20  se TK_COMMA:.   
8100: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
8110: 44 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  D:.      case TK
8120: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 20 20 63  _BITNOT:.      c
8130: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
8140: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
8150: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
8160: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f        case TK_NO
8170: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  T:.      case TK
8180: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 63 61 73  _NULL:.      cas
8190: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
81a0: 20 20 20 69 66 28 20 74 6f 6b 65 6e 54 79 70 65     if( tokenType
81b0: 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
81c0: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 54         if( prevT
81d0: 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b 5f 49 53 20  okenType==TK_IS 
81e0: 7c 7c 20 70 72 65 76 54 6f 6b 65 6e 54 79 70 65  || prevTokenType
81f0: 3d 3d 54 4b 5f 4e 4f 54 20 29 7b 0a 20 20 20 20  ==TK_NOT ){.    
8200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20          /* NULL 
8210: 69 73 20 61 20 6b 65 79 77 6f 72 64 20 69 6e 20  is a keyword in 
8220: 74 68 69 73 20 63 61 73 65 2c 20 6e 6f 74 20 61  this case, not a
8230: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20 2a   literal value *
8240: 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  /.          }els
8250: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
8260: 2a 20 48 65 72 65 20 74 68 65 20 4e 55 4c 4c 20  * Here the NULL 
8270: 69 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  is a literal val
8280: 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ue */.          
8290: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a    z[j++] = '?';.
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
82b0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
82c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
82d0: 20 69 66 28 20 6a 3e 30 20 26 26 20 73 71 6c 69   if( j>0 && sqli
82e0: 74 65 33 49 73 49 64 43 68 61 72 28 7a 5b 6a 2d  te3IsIdChar(z[j-
82f0: 31 5d 29 20 26 26 20 73 71 6c 69 74 65 33 49 73  1]) && sqlite3Is
8300: 49 64 43 68 61 72 28 7a 53 71 6c 5b 69 5d 29 20  IdChar(zSql[i]) 
8310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
8320: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
8330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8340: 20 74 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b 5f 49   tokenType==TK_I
8350: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  D ){.          i
8360: 6e 74 20 69 32 20 3d 20 69 2c 20 6e 32 20 3d 20  nt i2 = i, n2 = 
8370: 6e 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  n, rc = SQLITE_O
8380: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
8390: 20 6e 50 61 72 65 6e 3e 30 20 29 7b 0a 20 20 20   nParen>0 ){.   
83a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
83b0: 20 6e 50 61 72 65 6e 3c 6e 53 71 6c 20 29 3b 0a   nParen<nSql );.
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
83d0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 69  te3HashInsert(&i
83e0: 6e 48 61 73 68 2c 20 7a 53 71 6c 2b 6e 50 61 72  nHash, zSql+nPar
83f0: 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  en, 0);.        
8400: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
8410: 28 20 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  ( flags&SQLITE_T
8420: 4f 4b 45 4e 5f 51 55 4f 54 45 44 20 29 7b 20 69  OKEN_QUOTED ){ i
8430: 32 2b 2b 3b 20 6e 32 2d 3d 32 3b 20 7d 0a 20 20  2++; n2-=2; }.  
8440: 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 75          if( shou
8450: 6c 64 54 72 65 61 74 41 73 49 64 65 6e 74 69 66  ldTreatAsIdentif
8460: 69 65 72 28 64 62 2c 20 7a 53 71 6c 2b 69 32 2c  ier(db, zSql+i2,
8470: 20 6e 32 2c 20 26 72 63 29 3d 3d 30 20 29 7b 0a   n2, &rc)==0 ){.
8480: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8490: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
84a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
84b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
84c0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   z);.           
84d0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
84e0: 65 61 72 28 26 69 6e 48 61 73 68 29 3b 0a 20 20  ear(&inHash);.  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8500: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn;.            
8510: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
8520: 28 20 73 71 6c 69 74 65 33 5f 6b 65 79 77 6f 72  ( sqlite3_keywor
8530: 64 5f 63 68 65 63 6b 28 7a 53 71 6c 2b 69 32 2c  d_check(zSql+i2,
8540: 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   n2)==0 ){.     
8550: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
8560: 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 20 20 20  = '?';.         
8570: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8590: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
85a0: 20 20 20 20 20 20 20 20 63 6f 70 79 4e 6f 72 6d          copyNorm
85b0: 61 6c 69 7a 65 64 54 6f 6b 65 6e 28 7a 53 71 6c  alizedToken(zSql
85c0: 2c 20 69 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 7a  , i, n, flags, z
85d0: 2c 20 26 6a 29 3b 0a 20 20 20 20 20 20 20 20 62  , &j);.        b
85e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
85f0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
8600: 28 20 6a 3c 6e 5a 20 26 26 20 22 6f 6e 65 22 20  ( j<nZ && "one" 
8610: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6a 3e 30 20  );.  while( j>0 
8620: 26 26 20 7a 5b 6a 2d 31 5d 3d 3d 27 20 27 20 29  && z[j-1]==' ' )
8630: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 69 66 28 20 6a  { j--; }.  if( j
8640: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 3b  >0 && z[j-1]!=';
8650: 27 20 29 7b 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3b  ' ){ z[j++] = ';
8660: 27 3b 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  '; }.  z[j] = 0;
8670: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 5a 20  .  assert( j<nZ 
8680: 26 26 20 22 74 77 6f 22 20 29 3b 0a 20 20 70 56  && "two" );.  pV
8690: 64 62 65 2d 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20  dbe->zNormSql = 
86a0: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  z;.  sqlite3Hash
86b0: 43 6c 65 61 72 28 26 69 6e 48 61 73 68 29 3b 0a  Clear(&inHash);.
86c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
86d0: 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c  TE_ENABLE_NORMAL
86e0: 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE */../*.** Re
86f0: 72 75 6e 20 74 68 65 20 63 6f 6d 70 69 6c 61 74  run the compilat
8700: 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 65 6d 65  ion of a stateme
8710: 6e 74 20 61 66 74 65 72 20 61 20 73 63 68 65 6d  nt after a schem
8720: 61 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20  a change..**.** 
8730: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
8740: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
8750: 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20 72 65 74   recompiled, ret
8760: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
8770: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20  therwise,.** if 
8780: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61  the statement ca
8790: 6e 6e 6f 74 20 62 65 20 72 65 63 6f 6d 70 69 6c  nnot be recompil
87a0: 65 64 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  ed because anoth
87b0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
87c0: 73 0a 2a 2a 20 6c 6f 63 6b 65 64 20 74 68 65 20  s.** locked the 
87d0: 73 71 6c 69 74 65 33 5f 6d 61 73 74 65 72 20 74  sqlite3_master t
87e0: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  able, return SQL
87f0: 49 54 45 5f 4c 4f 43 4b 45 44 2e 20 49 66 20 61  ITE_LOCKED. If a
8800: 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ny other error.*
8810: 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
8820: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a   SQLITE_SCHEMA..
8830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65  */.int sqlite3Re
8840: 70 72 65 70 61 72 65 28 56 64 62 65 20 2a 70 29  prepare(Vdbe *p)
8850: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
8860: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 77  lite3_stmt *pNew
8870: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8880: 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  zSql;.  sqlite3 
8890: 2a 64 62 3b 0a 20 20 75 38 20 70 72 65 70 46 6c  *db;.  u8 prepFl
88a0: 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ags;..  assert( 
88b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
88c0: 6c 64 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ld(sqlite3VdbeDb
88d0: 28 70 29 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (p)->mutex) );. 
88e0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
88f0: 73 71 6c 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  sql((sqlite3_stm
8900: 74 20 2a 29 70 29 3b 0a 20 20 61 73 73 65 72 74  t *)p);.  assert
8910: 28 20 7a 53 71 6c 21 3d 30 20 29 3b 20 20 2f 2a  ( zSql!=0 );  /*
8920: 20 52 65 70 72 65 70 61 72 65 20 6f 6e 6c 79 20   Reprepare only 
8930: 63 61 6c 6c 65 64 20 66 6f 72 20 70 72 65 70 61  called for prepa
8940: 72 65 5f 76 32 28 29 20 73 74 61 74 65 6d 65 6e  re_v2() statemen
8950: 74 73 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  ts */.  db = sql
8960: 69 74 65 33 56 64 62 65 44 62 28 70 29 3b 0a 20  ite3VdbeDb(p);. 
8970: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8980: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
8990: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 72 65 70  mutex) );.  prep
89a0: 46 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 56  Flags = sqlite3V
89b0: 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
89c0: 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
89d0: 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65  e3LockAndPrepare
89e0: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
89f0: 72 65 70 46 6c 61 67 73 2c 20 70 2c 20 26 70 4e  repFlags, p, &pN
8a00: 65 77 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ew, 0);.  if( rc
8a10: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
8a20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
8a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
8a40: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
8a50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
8a60: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  w==0 );.    retu
8a70: 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rn rc;.  }else{.
8a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
8a90: 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  !=0 );.  }.  sql
8aa0: 69 74 65 33 56 64 62 65 53 77 61 70 28 28 56 64  ite3VdbeSwap((Vd
8ab0: 62 65 2a 29 70 4e 65 77 2c 20 70 29 3b 0a 20 20  be*)pNew, p);.  
8ac0: 73 71 6c 69 74 65 33 54 72 61 6e 73 66 65 72 42  sqlite3TransferB
8ad0: 69 6e 64 69 6e 67 73 28 70 4e 65 77 2c 20 28 73  indings(pNew, (s
8ae0: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 3b  qlite3_stmt*)p);
8af0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
8b00: 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 28 56  setStepResult((V
8b10: 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20 73 71  dbe*)pNew);.  sq
8b20: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
8b30: 65 28 28 56 64 62 65 2a 29 70 4e 65 77 29 3b 0a  e((Vdbe*)pNew);.
8b40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b50: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 77  OK;.}.../*.** Tw
8b60: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8b70: 65 20 6f 66 66 69 63 69 61 6c 20 41 50 49 2e 20  e official API. 
8b80: 20 4c 65 67 61 63 79 20 61 6e 64 20 6e 65 77 20   Legacy and new 
8b90: 75 73 65 2e 20 20 49 6e 20 74 68 65 20 6c 65 67  use.  In the leg
8ba0: 61 63 79 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20  acy.** version, 
8bb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
8bc0: 20 74 65 78 74 20 69 73 20 6e 6f 74 20 73 61 76   text is not sav
8bd0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  ed in the prepar
8be0: 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ed statement.** 
8bf0: 61 6e 64 20 73 6f 20 69 66 20 61 20 73 63 68 65  and so if a sche
8c00: 6d 61 20 63 68 61 6e 67 65 20 6f 63 63 75 72 73  ma change occurs
8c10: 2c 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  , SQLITE_SCHEMA 
8c20: 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a  is returned by.*
8c30: 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  * sqlite3_step()
8c40: 2e 20 20 49 6e 20 74 68 65 20 6e 65 77 20 76 65  .  In the new ve
8c50: 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69  rsion, the origi
8c60: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20  nal SQL text is 
8c70: 72 65 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 64 20  retained.** and 
8c80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
8c90: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72   automatically r
8ca0: 65 63 6f 6d 70 69 6c 65 64 20 69 66 20 61 6e 20  ecompiled if an 
8cb0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 0a 2a 2a  schema change.**
8cc0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
8cd0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
8ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d00: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
8d10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8d20: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
8d30: 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  /* UTF-8 encoded
8d40: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
8d50: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8d70: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
8d80: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
8d90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
8da0: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
8db0: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
8dc0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
8dd0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
8de0: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
8df0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
8e00: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
8e10: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
8e20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8e30: 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64  LockAndPrepare(d
8e40: 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 30 2c  b,zSql,nBytes,0,
8e50: 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29  0,ppStmt,pzTail)
8e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
8e70: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53  SQLITE_OK || ppS
8e80: 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d  tmt==0 || *ppStm
8e90: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45 52 49  t==0 );  /* VERI
8ea0: 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a 20 20  FY: F13021 */.  
8eb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
8ec0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
8ed0: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
8ee0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
8ef0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
8f00: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
8f10: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
8f20: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
8f30: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
8f40: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
8f50: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
8f60: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8f70: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
8f80: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
8f90: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a   **ppStmt,    /*
8fa0: 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20   OUT: A pointer 
8fb0: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
8fc0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
8fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
8fe0: 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  il       /* OUT:
8ff0: 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73   End of parsed s
9000: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
9010: 74 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45  t rc;.  /* EVIDE
9020: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 32 33 2d  NCE-OF: R-37923-
9030: 31 32 31 37 33 20 54 68 65 20 73 71 6c 69 74 65  12173 The sqlite
9040: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 69  3_prepare_v2() i
9050: 6e 74 65 72 66 61 63 65 20 77 6f 72 6b 73 0a 20  nterface works. 
9060: 20 2a 2a 20 65 78 61 63 74 6c 79 20 74 68 65 20   ** exactly the 
9070: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
9080: 70 72 65 70 61 72 65 5f 76 33 28 29 20 77 69 74  prepare_v3() wit
9090: 68 20 61 20 7a 65 72 6f 20 70 72 65 70 46 6c 61  h a zero prepFla
90a0: 67 73 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  gs.  ** paramete
90b0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 6f  r..  **.  ** Pro
90c0: 6f 66 20 69 6e 20 74 68 61 74 20 74 68 65 20 35  of in that the 5
90d0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  th parameter to 
90e0: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
90f0: 65 70 61 72 65 20 69 73 20 30 20 2a 2f 0a 20 20  epare is 0 */.  
9100: 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b  rc = sqlite3Lock
9110: 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53  AndPrepare(db,zS
9120: 71 6c 2c 6e 42 79 74 65 73 2c 53 51 4c 49 54 45  ql,nBytes,SQLITE
9130: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
9140: 2c 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,0,.            
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b   ppStmt,pzTail);
9170: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
9180: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74  QLITE_OK || ppSt
9190: 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74  mt==0 || *ppStmt
91a0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
91b0: 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
91c0: 33 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20 20  3_prepare_v3(.  
91d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
91e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
91f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f  abase handle. */
9200: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9210: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql,         /* 
9220: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51  UTF-8 encoded SQ
9230: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  L statement. */.
9240: 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20    int nBytes,   
9250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9260: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
9270: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 75 6e 73   bytes. */.  uns
9280: 69 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46 6c  igned int prepFl
9290: 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72 6f 20 6f  ags,   /* Zero o
92a0: 72 20 6d 6f 72 65 20 53 51 4c 49 54 45 5f 50 52  r more SQLITE_PR
92b0: 45 50 41 52 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  EPARE_* flags */
92c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
92d0: 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20  **ppStmt,    /* 
92e0: 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74  OUT: A pointer t
92f0: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
9300: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
9310: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69  nst char **pzTai
9320: 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  l       /* OUT: 
9330: 45 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74  End of parsed st
9340: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
9350: 20 72 63 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e   rc;.  /* EVIDEN
9360: 43 45 2d 4f 46 3a 20 52 2d 35 36 38 36 31 2d 34  CE-OF: R-56861-4
9370: 32 36 37 33 20 73 71 6c 69 74 65 33 5f 70 72 65  2673 sqlite3_pre
9380: 70 61 72 65 5f 76 33 28 29 20 64 69 66 66 65 72  pare_v3() differ
9390: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  s from.  ** sqli
93a0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
93b0: 20 6f 6e 6c 79 20 69 6e 20 68 61 76 69 6e 67 20   only in having 
93c0: 74 68 65 20 65 78 74 72 61 20 70 72 65 70 46 6c  the extra prepFl
93d0: 61 67 73 20 70 61 72 61 6d 65 74 65 72 2c 0a 20  ags parameter,. 
93e0: 20 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20 62   ** which is a b
93f0: 69 74 20 61 72 72 61 79 20 63 6f 6e 73 69 73 74  it array consist
9400: 69 6e 67 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ing of zero or m
9410: 6f 72 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ore of the.  ** 
9420: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a  SQLITE_PREPARE_*
9430: 20 66 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a   flags..  **.  *
9440: 2a 20 50 72 6f 6f 66 20 62 79 20 63 6f 6d 70 61  * Proof by compa
9450: 72 69 73 6f 6e 20 74 6f 20 74 68 65 20 69 6d 70  rison to the imp
9460: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
9470: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
9480: 32 28 29 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c  2().  ** directl
9490: 79 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 72 63  y above. */.  rc
94a0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e   = sqlite3LockAn
94b0: 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c  dPrepare(db,zSql
94c0: 2c 6e 42 79 74 65 73 2c 0a 20 20 20 20 20 20 20  ,nBytes,.       
94d0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
94e0: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
94f0: 7c 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49  |(prepFlags&SQLI
9500: 54 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29  TE_PREPARE_MASK)
9510: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9520: 20 20 20 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61     0,ppStmt,pzTa
9530: 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  il);.  assert( r
9540: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
9550: 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70  ppStmt==0 || *pp
9560: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Stmt==0 );.  ret
9570: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e  urn rc;.}...#ifn
9580: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9590: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  UTF16./*.** Comp
95a0: 69 6c 65 20 74 68 65 20 55 54 46 2d 31 36 20 65  ile the UTF-16 e
95b0: 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65  ncoded SQL state
95c0: 6d 65 6e 74 20 7a 53 71 6c 20 69 6e 74 6f 20 61  ment zSql into a
95d0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
95e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
95f0: 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65 31   sqlite3Prepare1
9600: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
9610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9620: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
9630: 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76  e. */ .  const v
9640: 6f 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  oid *zSql,      
9650: 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63     /* UTF-16 enc
9660: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
9670: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
9680: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
9690: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
96a0: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
96b0: 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67  /.  u32 prepFlag
96c0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
96d0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
96e0: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
96f0: 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
9700: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
9710: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
9720: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
9730: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9740: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
9750: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
9760: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
9770: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
9780: 7b 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  {.  /* This func
9790: 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 77  tion currently w
97a0: 6f 72 6b 73 20 62 79 20 66 69 72 73 74 20 74 72  orks by first tr
97b0: 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 55  ansforming the U
97c0: 54 46 2d 31 36 0a 20 20 2a 2a 20 65 6e 63 6f 64  TF-16.  ** encod
97d0: 65 64 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  ed string to UTF
97e0: 2d 38 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 69 6e  -8, then invokin
97f0: 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  g sqlite3_prepar
9800: 65 28 29 2e 20 54 68 65 0a 20 20 2a 2a 20 74 72  e(). The.  ** tr
9810: 69 63 6b 79 20 62 69 74 20 69 73 20 66 69 67 75  icky bit is figu
9820: 72 69 6e 67 20 6f 75 74 20 74 68 65 20 70 6f 69  ring out the poi
9830: 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 69  nter to return i
9840: 6e 20 2a 70 7a 54 61 69 6c 2e 0a 20 20 2a 2f 0a  n *pzTail..  */.
9850: 20 20 63 68 61 72 20 2a 7a 53 71 6c 38 3b 0a 20    char *zSql8;. 
9860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
9870: 69 6c 38 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  il8 = 0;.  int r
9880: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
9890: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
98a0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
98b0: 20 69 66 28 20 70 70 53 74 6d 74 3d 3d 30 20 29   if( ppStmt==0 )
98c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
98d0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
98e0: 69 66 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  if.  *ppStmt = 0
98f0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
9900: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
9910: 29 7c 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  )||zSql==0 ){.  
9920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9930: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
9940: 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3e 3d 30  .  if( nBytes>=0
9950: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a   ){.    int sz;.
9960: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9970: 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
9980: 29 7a 53 71 6c 3b 0a 20 20 20 20 66 6f 72 28 73  )zSql;.    for(s
9990: 7a 3d 30 3b 20 73 7a 3c 6e 42 79 74 65 73 20 26  z=0; sz<nBytes &
99a0: 26 20 28 7a 5b 73 7a 5d 21 3d 30 20 7c 7c 20 7a  & (z[sz]!=0 || z
99b0: 5b 73 7a 2b 31 5d 21 3d 30 29 3b 20 73 7a 20 2b  [sz+1]!=0); sz +
99c0: 3d 20 32 29 7b 7d 0a 20 20 20 20 6e 42 79 74 65  = 2){}.    nByte
99d0: 73 20 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 73 71  s = sz;.  }.  sq
99e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
99f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9a00: 7a 53 71 6c 38 20 3d 20 73 71 6c 69 74 65 33 55  zSql8 = sqlite3U
9a10: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 53 71 6c  tf16to8(db, zSql
9a20: 2c 20 6e 42 79 74 65 73 2c 20 53 51 4c 49 54 45  , nBytes, SQLITE
9a30: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
9a40: 20 69 66 28 20 7a 53 71 6c 38 20 29 7b 0a 20 20   if( zSql8 ){.  
9a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
9a60: 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c  ckAndPrepare(db,
9a70: 20 7a 53 71 6c 38 2c 20 2d 31 2c 20 70 72 65 70   zSql8, -1, prep
9a80: 46 6c 61 67 73 2c 20 30 2c 20 70 70 53 74 6d 74  Flags, 0, ppStmt
9a90: 2c 20 26 7a 54 61 69 6c 38 29 3b 0a 20 20 7d 0a  , &zTail8);.  }.
9aa0: 0a 20 20 69 66 28 20 7a 54 61 69 6c 38 20 26 26  .  if( zTail8 &&
9ab0: 20 70 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 2f   pzTail ){.    /
9ac0: 2a 20 49 66 20 73 71 6c 69 74 65 33 5f 70 72 65  * If sqlite3_pre
9ad0: 70 61 72 65 20 72 65 74 75 72 6e 73 20 61 20 74  pare returns a t
9ae0: 61 69 6c 20 70 6f 69 6e 74 65 72 2c 20 77 65 20  ail pointer, we 
9af0: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 0a 20 20  calculate the.  
9b00: 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
9b10: 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 74 68 65  pointer into the
9b20: 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 62   UTF-16 string b
9b30: 79 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 20 75  y counting the u
9b40: 6e 69 63 6f 64 65 0a 20 20 20 20 2a 2a 20 63 68  nicode.    ** ch
9b50: 61 72 61 63 74 65 72 73 20 62 65 74 77 65 65 6e  aracters between
9b60: 20 7a 53 71 6c 38 20 61 6e 64 20 7a 54 61 69 6c   zSql8 and zTail
9b70: 38 2c 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  8, and then retu
9b80: 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 0a  rning a pointer.
9b90: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
9ba0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
9bb0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 55 54  ters into the UT
9bc0: 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 20 20 20  F-16 string..   
9bd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68 61 72   */.    int char
9be0: 73 5f 70 61 72 73 65 64 20 3d 20 73 71 6c 69 74  s_parsed = sqlit
9bf0: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 53  e3Utf8CharLen(zS
9c00: 71 6c 38 2c 20 28 69 6e 74 29 28 7a 54 61 69 6c  ql8, (int)(zTail
9c10: 38 2d 7a 53 71 6c 38 29 29 3b 0a 20 20 20 20 2a  8-zSql8));.    *
9c20: 70 7a 54 61 69 6c 20 3d 20 28 75 38 20 2a 29 7a  pzTail = (u8 *)z
9c30: 53 71 6c 20 2b 20 73 71 6c 69 74 65 33 55 74 66  Sql + sqlite3Utf
9c40: 31 36 42 79 74 65 4c 65 6e 28 7a 53 71 6c 2c 20  16ByteLen(zSql, 
9c50: 63 68 61 72 73 5f 70 61 72 73 65 64 29 3b 0a 20  chars_parsed);. 
9c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
9c70: 65 65 28 64 62 2c 20 7a 53 71 6c 38 29 3b 20 0a  ee(db, zSql8); .
9c80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
9c90: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
9ca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9cb0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9cc0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9cd0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 65 72 73 69  ./*.** Two versi
9ce0: 6f 6e 73 20 6f 66 20 74 68 65 20 6f 66 66 69 63  ons of the offic
9cf0: 69 61 6c 20 41 50 49 2e 20 20 4c 65 67 61 63 79  ial API.  Legacy
9d00: 20 61 6e 64 20 6e 65 77 20 75 73 65 2e 20 20 49   and new use.  I
9d10: 6e 20 74 68 65 20 6c 65 67 61 63 79 0a 2a 2a 20  n the legacy.** 
9d20: 76 65 72 73 69 6f 6e 2c 20 74 68 65 20 6f 72 69  version, the ori
9d30: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69  ginal SQL text i
9d40: 73 20 6e 6f 74 20 73 61 76 65 64 20 69 6e 20 74  s not saved in t
9d50: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
9d60: 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 73 6f 20  ement.** and so 
9d70: 69 66 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e  if a schema chan
9d80: 67 65 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  ge occurs, SQLIT
9d90: 45 5f 53 43 48 45 4d 41 20 69 73 20 72 65 74 75  E_SCHEMA is retu
9da0: 72 6e 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74  rned by.** sqlit
9db0: 65 33 5f 73 74 65 70 28 29 2e 20 20 49 6e 20 74  e3_step().  In t
9dc0: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 2c 20  he new version, 
9dd0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
9de0: 20 74 65 78 74 20 69 73 20 72 65 74 61 69 6e 65   text is retaine
9df0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61  d.** and the sta
9e00: 74 65 6d 65 6e 74 20 69 73 20 61 75 74 6f 6d 61  tement is automa
9e10: 74 69 63 61 6c 6c 79 20 72 65 63 6f 6d 70 69 6c  tically recompil
9e20: 65 64 20 69 66 20 61 6e 20 73 63 68 65 6d 61 20  ed if an schema 
9e30: 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75 72 73  change.** occurs
9e40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9e50: 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 73 71  _prepare16(.  sq
9e60: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
9e70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9e80: 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a  ase handle. */ .
9e90: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
9ea0: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ql,         /* U
9eb0: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53 51  TF-16 encoded SQ
9ec0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  L statement. */.
9ed0: 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20    int nBytes,   
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9ef0: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
9f00: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c   bytes. */.  sql
9f10: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
9f20: 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41  mt,    /* OUT: A
9f30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9f40: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9f50: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  nt */.  const vo
9f60: 69 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20  id **pzTail     
9f70: 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66    /* OUT: End of
9f80: 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a   parsed string *
9f90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
9fa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72 65   rc = sqlite3Pre
9fb0: 70 61 72 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e  pare16(db,zSql,n
9fc0: 42 79 74 65 73 2c 30 2c 70 70 53 74 6d 74 2c 70  Bytes,0,ppStmt,p
9fd0: 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74  zTail);.  assert
9fe0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9ff0: 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c 7c 20  || ppStmt==0 || 
a000: 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20 20 2f  *ppStmt==0 );  /
a010: 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30 32 31  * VERIFY: F13021
a020: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
a030: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  .}.int sqlite3_p
a040: 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20 73  repare16_v2(.  s
a050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
a060: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
a070: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 20  base handle. */ 
a080: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
a090: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql,         /* 
a0a0: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 53  UTF-16 encoded S
a0b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  QL statement. */
a0c0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20  .  int nBytes,  
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0e0: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
a0f0: 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71  n bytes. */.  sq
a100: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
a110: 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20  tmt,    /* OUT: 
a120: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
a130: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
a140: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ent */.  const v
a150: 6f 69 64 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20  oid **pzTail    
a160: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f     /* OUT: End o
a170: 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67 20  f parsed string 
a180: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
a190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 72    rc = sqlite3Pr
a1a0: 65 70 61 72 65 31 36 28 64 62 2c 7a 53 71 6c 2c  epare16(db,zSql,
a1b0: 6e 42 79 74 65 73 2c 53 51 4c 49 54 45 5f 50 52  nBytes,SQLITE_PR
a1c0: 45 50 41 52 45 5f 53 41 56 45 53 51 4c 2c 70 70  EPARE_SAVESQL,pp
a1d0: 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20  Stmt,pzTail);.  
a1e0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
a1f0: 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d  TE_OK || ppStmt=
a200: 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30  =0 || *ppStmt==0
a210: 20 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20   );  /* VERIFY: 
a220: 46 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75  F13021 */.  retu
a230: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
a240: 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
a250: 33 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  3(.  sqlite3 *db
a260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a270: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a280: 65 2e 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 76  e. */ .  const v
a290: 6f 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  oid *zSql,      
a2a0: 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 65 6e 63     /* UTF-16 enc
a2b0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
a2c0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
a2d0: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
a2e0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
a2f0: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
a300: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
a310: 20 70 72 65 70 46 6c 61 67 73 2c 20 20 20 2f 2a   prepFlags,   /*
a320: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
a330: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
a340: 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
a350: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
a360: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
a370: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
a380: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
a390: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
a3a0: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
a3b0: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
a3c0: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
a3d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
a3e0: 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72   = sqlite3Prepar
a3f0: 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  e16(db,zSql,nByt
a400: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  es,.         SQL
a410: 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41 56 45  ITE_PREPARE_SAVE
a420: 53 51 4c 7c 28 70 72 65 70 46 6c 61 67 73 26 53  SQL|(prepFlags&S
a430: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4d 41  QLITE_PREPARE_MA
a440: 53 4b 29 2c 0a 20 20 20 20 20 20 20 20 20 70 70  SK),.         pp
a450: 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20  Stmt,pzTail);.  
a460: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
a470: 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d  TE_OK || ppStmt=
a480: 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30  =0 || *ppStmt==0
a490: 20 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20   );  /* VERIFY: 
a4a0: 46 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75  F13021 */.  retu
a4b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
a4c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a4d0: 55 54 46 31 36 20 2a 2f 0a                       UTF16 */.