/ Hex Artifact Content
Login

Artifact 24812a79d17c4271b3989d7f2891bc16bb0c87e43806ede192fe0c4e2b283ed4:


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 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1af0: 33 53 63 68 65 6d 61 44 69 73 63 6f 6e 6e 65 63  3SchemaDisconnec
1b00: 74 28 64 62 2c 20 69 44 62 2c 20 31 29 3b 0a 20  t(db, iDb, 1);. 
1b10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b20: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 72 72 6f  E_OK ) goto erro
1b30: 72 5f 6f 75 74 3b 0a 20 20 20 20 61 73 73 65 72  r_out;.    asser
1b40: 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  t( pDb->pSchema 
1b50: 26 26 20 70 44 62 2d 3e 70 53 50 6f 6f 6c 3d 3d  && pDb->pSPool==
1b60: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 64 62 2d 3e  0 );.  }..  db->
1b70: 69 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 0a  init.busy = 1;..
1b80: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
1b90: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
1ba0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 63 68 65  resentation sche
1bb0: 6d 61 20 74 61 62 6c 65 73 20 28 73 71 6c 69 74  ma tables (sqlit
1bc0: 65 5f 6d 61 73 74 65 72 20 6f 72 0a 20 20 2a 2a  e_master or.  **
1bd0: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
1be0: 74 65 72 29 20 62 79 20 69 6e 76 6f 6b 69 6e 67  ter) by invoking
1bf0: 20 74 68 65 20 70 61 72 73 65 72 20 64 69 72 65   the parser dire
1c00: 63 74 6c 79 2e 20 20 54 68 65 20 61 70 70 72 6f  ctly.  The appro
1c10: 70 72 69 61 74 65 0a 20 20 2a 2a 20 74 61 62 6c  priate.  ** tabl
1c20: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 69  e name will be i
1c30: 6e 73 65 72 74 65 64 20 61 75 74 6f 6d 61 74 69  nserted automati
1c40: 63 61 6c 6c 79 20 62 79 20 74 68 65 20 70 61 72  cally by the par
1c50: 73 65 72 20 73 6f 20 77 65 20 63 61 6e 20 6a 75  ser so we can ju
1c60: 73 74 0a 20 20 2a 2a 20 75 73 65 20 74 68 65 20  st.  ** use the 
1c70: 61 62 62 72 65 76 69 61 74 69 6f 6e 20 22 78 22  abbreviation "x"
1c80: 20 68 65 72 65 2e 20 20 54 68 65 20 70 61 72 73   here.  The pars
1c90: 65 72 20 77 69 6c 6c 20 61 6c 73 6f 20 61 75 74  er will also aut
1ca0: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 61 67 0a 20  omatically tag. 
1cb0: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74   ** the schema t
1cc0: 61 62 6c 65 20 61 73 20 72 65 61 64 2d 6f 6e 6c  able as read-onl
1cd0: 79 2e 20 2a 2f 0a 20 20 61 7a 41 72 67 5b 30 5d  y. */.  azArg[0]
1ce0: 20 3d 20 7a 4d 61 73 74 65 72 4e 61 6d 65 20 3d   = zMasterName =
1cf0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1d00: 62 29 3b 0a 20 20 61 7a 41 72 67 5b 31 5d 20 3d  b);.  azArg[1] =
1d10: 20 22 31 22 3b 0a 20 20 61 7a 41 72 67 5b 32 5d   "1";.  azArg[2]
1d20: 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   = "CREATE TABLE
1d30: 20 78 28 74 79 70 65 20 74 65 78 74 2c 6e 61 6d   x(type text,nam
1d40: 65 20 74 65 78 74 2c 74 62 6c 5f 6e 61 6d 65 20  e text,tbl_name 
1d50: 74 65 78 74 2c 22 0a 20 20 20 20 20 20 20 20 20  text,".         
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 22 72 6f 6f 74 70 61 67 65 20 69 6e 74     "rootpage int
1d80: 2c 73 71 6c 20 74 65 78 74 29 22 3b 0a 20 20 61  ,sql text)";.  a
1d90: 7a 41 72 67 5b 33 5d 20 3d 20 30 3b 0a 20 20 69  zArg[3] = 0;.  i
1da0: 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b  nitData.db = db;
1db0: 0a 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20  .  initData.iDb 
1dc0: 3d 20 69 44 62 3b 0a 20 20 69 6e 69 74 44 61 74  = iDb;.  initDat
1dd0: 61 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  a.rc = SQLITE_OK
1de0: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45  ;.  initData.pzE
1df0: 72 72 4d 73 67 20 3d 20 70 7a 45 72 72 4d 73 67  rrMsg = pzErrMsg
1e00: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 6d 49 6e  ;.  initData.mIn
1e10: 69 74 46 6c 61 67 73 20 3d 20 6d 46 6c 61 67 73  itFlags = mFlags
1e20: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 69 74 43  ;.  sqlite3InitC
1e30: 61 6c 6c 62 61 63 6b 28 26 69 6e 69 74 44 61 74  allback(&initDat
1e40: 61 2c 20 33 2c 20 28 63 68 61 72 20 2a 2a 29 61  a, 3, (char **)a
1e50: 7a 41 72 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  zArg, 0);.  if( 
1e60: 69 6e 69 74 44 61 74 61 2e 72 63 20 29 7b 0a 20  initData.rc ){. 
1e70: 20 20 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61     rc = initData
1e80: 2e 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  .rc;.    goto er
1e90: 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1ea0: 2f 2a 20 43 72 65 61 74 65 20 61 20 63 75 72 73  /* Create a curs
1eb0: 6f 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  or to hold the d
1ec0: 61 74 61 62 61 73 65 20 6f 70 65 6e 0a 20 20 2a  atabase open.  *
1ed0: 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74  /.  if( pDb->pBt
1ee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1ef0: 74 28 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  t( iDb==1 );.   
1f00: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
1f10: 62 2c 20 31 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 1, DB_SchemaL
1f20: 6f 61 64 65 64 29 3b 0a 20 20 20 20 72 63 20 3d  oaded);.    rc =
1f30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f40: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1f50: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f60: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
1f70: 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f  y a read-only (o
1f80: 72 20 72 65 61 64 2d 77 72 69 74 65 29 20 74 72  r read-write) tr
1f90: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
1fa0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62 2d 74  .  ** on the b-t
1fb0: 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70  ree database, op
1fc0: 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61  en one now. If a
1fd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1fe0: 6f 70 65 6e 65 64 2c 20 69 74 20 0a 20 20 2a 2a  opened, it .  **
1ff0: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 64 20   will be closed 
2000: 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2010: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 20 2a  tion returns.  *
2020: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
2030: 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Enter(pDb->pBt);
2040: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42  .  if( !sqlite3B
2050: 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
2060: 73 28 70 44 62 2d 3e 70 42 74 29 20 29 7b 0a 20  s(pDb->pBt) ){. 
2070: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2080: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
2090: 44 62 2d 3e 70 42 74 2c 20 30 2c 20 30 29 3b 0a  Db->pBt, 0, 0);.
20a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
20c0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
20d0: 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 73 71  pzErrMsg, db, sq
20e0: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
20f0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69  ;.      goto ini
2100: 74 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a  tone_error_out;.
2110: 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 65 64      }.    opened
2120: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 31 3b  Transaction = 1;
2130: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74  .  }..  /* Get t
2140: 68 65 20 64 61 74 61 62 61 73 65 20 6d 65 74 61  he database meta
2150: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
2160: 2a 2a 0a 20 20 2a 2a 20 4d 65 74 61 20 76 61 6c  **.  ** Meta val
2170: 75 65 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f  ues are as follo
2180: 77 73 3a 0a 20 20 2a 2a 20 20 20 20 6d 65 74 61  ws:.  **    meta
2190: 5b 30 5d 20 20 20 53 63 68 65 6d 61 20 63 6f 6f  [0]   Schema coo
21a0: 6b 69 65 2e 20 20 43 68 61 6e 67 65 73 20 77 69  kie.  Changes wi
21b0: 74 68 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  th each schema c
21c0: 68 61 6e 67 65 2e 0a 20 20 2a 2a 20 20 20 20 6d  hange..  **    m
21d0: 65 74 61 5b 31 5d 20 20 20 46 69 6c 65 20 66 6f  eta[1]   File fo
21e0: 72 6d 61 74 20 6f 66 20 73 63 68 65 6d 61 20 6c  rmat of schema l
21f0: 61 79 65 72 2e 0a 20 20 2a 2a 20 20 20 20 6d 65  ayer..  **    me
2200: 74 61 5b 32 5d 20 20 20 53 69 7a 65 20 6f 66 20  ta[2]   Size of 
2210: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 0a  the page cache..
2220: 20 20 2a 2a 20 20 20 20 6d 65 74 61 5b 33 5d 20    **    meta[3] 
2230: 20 20 4c 61 72 67 65 73 74 20 72 6f 6f 74 70 61    Largest rootpa
2240: 67 65 20 28 61 75 74 6f 2f 69 6e 63 72 5f 76 61  ge (auto/incr_va
2250: 63 75 75 6d 20 6d 6f 64 65 29 0a 20 20 2a 2a 20  cuum mode).  ** 
2260: 20 20 20 6d 65 74 61 5b 34 5d 20 20 20 44 62 20     meta[4]   Db 
2270: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20 31  text encoding. 1
2280: 3a 55 54 46 2d 38 20 32 3a 55 54 46 2d 31 36 4c  :UTF-8 2:UTF-16L
2290: 45 20 33 3a 55 54 46 2d 31 36 42 45 0a 20 20 2a  E 3:UTF-16BE.  *
22a0: 2a 20 20 20 20 6d 65 74 61 5b 35 5d 20 20 20 55  *    meta[5]   U
22b0: 73 65 72 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ser version.  **
22c0: 20 20 20 20 6d 65 74 61 5b 36 5d 20 20 20 49 6e      meta[6]   In
22d0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
22e0: 20 6d 6f 64 65 0a 20 20 2a 2a 20 20 20 20 6d 65   mode.  **    me
22f0: 74 61 5b 37 5d 20 20 20 75 6e 75 73 65 64 0a 20  ta[7]   unused. 
2300: 20 2a 2a 20 20 20 20 6d 65 74 61 5b 38 5d 20 20   **    meta[8]  
2310: 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 20 20 20   unused.  **    
2320: 6d 65 74 61 5b 39 5d 20 20 20 75 6e 75 73 65 64  meta[9]   unused
2330: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a  .  **.  ** Note:
2340: 20 54 68 65 20 23 64 65 66 69 6e 65 64 20 53 51   The #defined SQ
2350: 4c 49 54 45 5f 55 54 46 2a 20 73 79 6d 62 6f 6c  LITE_UTF* symbol
2360: 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
2370: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a 20   correspond to. 
2380: 20 2a 2a 20 74 68 65 20 70 6f 73 73 69 62 6c 65   ** the possible
2390: 20 76 61 6c 75 65 73 20 6f 66 20 6d 65 74 61 5b   values of meta[
23a0: 34 5d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  4]..  */.  for(i
23b0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
23c0: 6d 65 74 61 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  meta); i++){.   
23d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
23e0: 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 69  Meta(pDb->pBt, i
23f0: 2b 31 2c 20 28 75 33 32 20 2a 29 26 6d 65 74 61  +1, (u32 *)&meta
2400: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
2410: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2420: 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73  ITE_ResetDatabas
2430: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  e)!=0 ){.    mem
2440: 73 65 74 28 6d 65 74 61 2c 20 30 2c 20 73 69 7a  set(meta, 0, siz
2450: 65 6f 66 28 6d 65 74 61 29 29 3b 0a 20 20 7d 0a  eof(meta));.  }.
2460: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
2470: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20  schema_cookie = 
2480: 6d 65 74 61 5b 42 54 52 45 45 5f 53 43 48 45 4d  meta[BTREE_SCHEM
2490: 41 5f 56 45 52 53 49 4f 4e 2d 31 5d 3b 0a 0a 20  A_VERSION-1];.. 
24a0: 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 61   /* If opening a
24b0: 20 6e 6f 6e 2d 65 6d 70 74 79 20 64 61 74 61 62   non-empty datab
24c0: 61 73 65 2c 20 63 68 65 63 6b 20 74 68 65 20 74  ase, check the t
24d0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 20 46 6f  ext encoding. Fo
24e0: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20  r the.  ** main 
24f0: 64 61 74 61 62 61 73 65 2c 20 73 65 74 20 73 71  database, set sq
2500: 6c 69 74 65 33 2e 65 6e 63 20 74 6f 20 74 68 65  lite3.enc to the
2510: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
2520: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a   main database..
2530: 20 20 2a 2a 20 46 6f 72 20 61 6e 20 61 74 74 61    ** For an atta
2540: 63 68 65 64 20 64 62 2c 20 69 74 20 69 73 20 61  ched db, it is a
2550: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 65  n error if the e
2560: 6e 63 6f 64 69 6e 67 20 69 73 20 6e 6f 74 20 74  ncoding is not t
2570: 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20  he same.  ** as 
2580: 73 71 6c 69 74 65 33 2e 65 6e 63 2e 0a 20 20 2a  sqlite3.enc..  *
2590: 2f 0a 20 20 69 66 28 20 6d 65 74 61 5b 42 54 52  /.  if( meta[BTR
25a0: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
25b0: 2d 31 5d 20 29 7b 20 20 2f 2a 20 74 65 78 74 20  -1] ){  /* text 
25c0: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20  encoding */.    
25d0: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 23 69  if( iDb==0 ){.#i
25e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25f0: 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 75 38  T_UTF16.      u8
2600: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20   encoding;.     
2610: 20 2f 2a 20 49 66 20 6f 70 65 6e 69 6e 67 20 74   /* If opening t
2620: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2630: 2c 20 73 65 74 20 45 4e 43 28 64 62 29 2e 20 2a  , set ENC(db). *
2640: 2f 0a 20 20 20 20 20 20 65 6e 63 6f 64 69 6e 67  /.      encoding
2650: 20 3d 20 28 75 38 29 6d 65 74 61 5b 42 54 52 45   = (u8)meta[BTRE
2660: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2d  E_TEXT_ENCODING-
2670: 31 5d 20 26 20 33 3b 0a 20 20 20 20 20 20 69 66  1] & 3;.      if
2680: 28 20 65 6e 63 6f 64 69 6e 67 3d 3d 30 20 29 20  ( encoding==0 ) 
2690: 65 6e 63 6f 64 69 6e 67 20 3d 20 53 51 4c 49 54  encoding = SQLIT
26a0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 45 4e  E_UTF8;.      EN
26b0: 43 28 64 62 29 20 3d 20 65 6e 63 6f 64 69 6e 67  C(db) = encoding
26c0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 45 4e  ;.#else.      EN
26d0: 43 28 64 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  C(db) = SQLITE_U
26e0: 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  TF8;.#endif.    
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2700: 49 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 61 74  If opening an at
2710: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2c  tached database,
2720: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6d 75   the encoding mu
2730: 63 68 20 6d 61 74 63 68 20 45 4e 43 28 64 62 29  ch match ENC(db)
2740: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 65   */.      if( me
2750: 74 61 5b 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  ta[BTREE_TEXT_EN
2760: 43 4f 44 49 4e 47 2d 31 5d 21 3d 45 4e 43 28 64  CODING-1]!=ENC(d
2770: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
2780: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70  lite3SetString(p
2790: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 61 74  zErrMsg, db, "at
27a0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
27b0: 20 6d 75 73 74 20 75 73 65 20 74 68 65 20 73 61   must use the sa
27c0: 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  me".            
27d0: 22 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  " text encoding 
27e0: 61 73 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  as main database
27f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2800: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2810: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 69 74         goto init
2820: 6f 6e 65 5f 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  one_error_out;. 
2830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2840: 65 6c 73 65 7b 0a 20 20 20 20 44 62 53 65 74 50  else{.    DbSetP
2850: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
2860: 20 44 42 5f 45 6d 70 74 79 29 3b 0a 20 20 7d 0a   DB_Empty);.  }.
2870: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
2880: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 0a  enc = ENC(db);..
2890: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
28a0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3d 3d  ma->cache_size==
28b0: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
28c0: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
28d0: 54 45 44 0a 20 20 20 20 73 69 7a 65 20 3d 20 73  TED.    size = s
28e0: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 6d  qlite3AbsInt32(m
28f0: 65 74 61 5b 42 54 52 45 45 5f 44 45 46 41 55 4c  eta[BTREE_DEFAUL
2900: 54 5f 43 41 43 48 45 5f 53 49 5a 45 2d 31 5d 29  T_CACHE_SIZE-1])
2910: 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3d 3d  ;.    if( size==
2920: 30 20 29 7b 20 73 69 7a 65 20 3d 20 53 51 4c 49  0 ){ size = SQLI
2930: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
2940: 5f 53 49 5a 45 3b 20 7d 0a 20 20 20 20 70 44 62  _SIZE; }.    pDb
2950: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
2960: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 23 65  _size = size;.#e
2970: 6c 73 65 0a 20 20 20 20 70 44 62 2d 3e 70 53 63  lse.    pDb->pSc
2980: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
2990: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
29a0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 23 65  T_CACHE_SIZE;.#e
29b0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
29c0: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
29d0: 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d  e(pDb->pBt, pDb-
29e0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
29f0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  size);.  }..  /*
2a00: 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72 6d 61  .  ** file_forma
2a10: 74 3d 3d 31 20 20 20 20 56 65 72 73 69 6f 6e 20  t==1    Version 
2a20: 33 2e 30 2e 30 2e 0a 20 20 2a 2a 20 66 69 6c 65  3.0.0..  ** file
2a30: 5f 66 6f 72 6d 61 74 3d 3d 32 20 20 20 20 56 65  _format==2    Ve
2a40: 72 73 69 6f 6e 20 33 2e 31 2e 33 2e 20 20 2f 2f  rsion 3.1.3.  //
2a50: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 41 44 44   ALTER TABLE ADD
2a60: 20 43 4f 4c 55 4d 4e 0a 20 20 2a 2a 20 66 69 6c   COLUMN.  ** fil
2a70: 65 5f 66 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56  e_format==3    V
2a80: 65 72 73 69 6f 6e 20 33 2e 31 2e 34 2e 20 20 2f  ersion 3.1.4.  /
2a90: 2f 20 64 69 74 74 6f 20 62 75 74 20 77 69 74 68  / ditto but with
2aa0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
2ab0: 74 73 0a 20 20 2a 2a 20 66 69 6c 65 5f 66 6f 72  ts.  ** file_for
2ac0: 6d 61 74 3d 3d 34 20 20 20 20 56 65 72 73 69 6f  mat==4    Versio
2ad0: 6e 20 33 2e 33 2e 30 2e 20 20 2f 2f 20 44 45 53  n 3.3.0.  // DES
2ae0: 43 20 69 6e 64 69 63 65 73 2e 20 20 42 6f 6f 6c  C indices.  Bool
2af0: 65 61 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  ean constants.  
2b00: 2a 2f 0a 20 20 70 44 62 2d 3e 70 53 63 68 65 6d  */.  pDb->pSchem
2b10: 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d  a->file_format =
2b20: 20 28 75 38 29 6d 65 74 61 5b 42 54 52 45 45 5f   (u8)meta[BTREE_
2b30: 46 49 4c 45 5f 46 4f 52 4d 41 54 2d 31 5d 3b 0a  FILE_FORMAT-1];.
2b40: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
2b50: 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3d  ma->file_format=
2b60: 3d 30 20 29 7b 0a 20 20 20 20 70 44 62 2d 3e 70  =0 ){.    pDb->p
2b70: 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
2b80: 6d 61 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  mat = 1;.  }.  i
2b90: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
2ba0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 53 51 4c  >file_format>SQL
2bb0: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
2bc0: 4d 41 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MAT ){.    sqlit
2bd0: 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  e3SetString(pzEr
2be0: 72 4d 73 67 2c 20 64 62 2c 20 22 75 6e 73 75 70  rMsg, db, "unsup
2bf0: 70 6f 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d  ported file form
2c00: 61 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  at");.    rc = S
2c10: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2c20: 20 67 6f 74 6f 20 69 6e 69 74 6f 6e 65 5f 65 72   goto initone_er
2c30: 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
2c40: 2f 2a 20 54 69 63 6b 65 74 20 23 32 38 30 34 3a  /* Ticket #2804:
2c50: 20 20 57 68 65 6e 20 77 65 20 6f 70 65 6e 20 61    When we open a
2c60: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
2c70: 20 6e 65 77 65 72 20 66 69 6c 65 20 66 6f 72 6d   newer file form
2c80: 61 74 2c 0a 20 20 2a 2a 20 63 6c 65 61 72 20 74  at,.  ** clear t
2c90: 68 65 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f 66  he legacy_file_f
2ca0: 6f 72 6d 61 74 20 70 72 61 67 6d 61 20 66 6c 61  ormat pragma fla
2cb0: 67 20 73 6f 20 74 68 61 74 20 61 20 56 41 43 55  g so that a VACU
2cc0: 55 4d 20 77 69 6c 6c 0a 20 20 2a 2a 20 6e 6f 74  UM will.  ** not
2cd0: 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 64   downgrade the d
2ce0: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 75 73  atabase and thus
2cf0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
2d00: 64 65 73 63 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  descending.  ** 
2d10: 69 6e 64 69 63 65 73 20 74 68 61 74 20 74 68 65  indices that the
2d20: 20 75 73 65 72 20 6d 69 67 68 74 20 68 61 76 65   user might have
2d30: 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   created..  */. 
2d40: 20 69 66 28 20 69 44 62 3d 3d 30 20 26 26 20 6d   if( iDb==0 && m
2d50: 65 74 61 5b 42 54 52 45 45 5f 46 49 4c 45 5f 46  eta[BTREE_FILE_F
2d60: 4f 52 4d 41 54 2d 31 5d 3e 3d 34 20 29 7b 0a 20  ORMAT-1]>=4 ){. 
2d70: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
2d80: 7e 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69  ~SQLITE_LegacyFi
2d90: 6c 65 46 6d 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  leFmt;.  }..  /*
2da0: 20 52 65 61 64 20 74 68 65 20 73 63 68 65 6d 61   Read the schema
2db0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
2dc0: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74   of the schema t
2dd0: 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 61 73 73  ables.  */.  ass
2de0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
2df0: 73 79 20 29 3b 0a 20 20 7b 0a 20 20 20 20 63 68  sy );.  {.    ch
2e00: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 7a 53  ar *zSql;.    zS
2e10: 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
2e20: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
2e30: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72   "SELECT name, r
2e40: 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f  ootpage, sql FRO
2e50: 4d 20 5c 22 25 77 5c 22 2e 25 73 20 4f 52 44 45  M \"%w\".%s ORDE
2e60: 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20  R BY rowid",.   
2e70: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
2e80: 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73  ].zDbSName, zMas
2e90: 74 65 72 4e 61 6d 65 29 3b 0a 23 69 66 6e 64 65  terName);.#ifnde
2ea0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2eb0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
2ec0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ed0: 78 61 75 74 68 20 78 41 75 74 68 3b 0a 20 20 20  xauth xAuth;.   
2ee0: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
2ef0: 41 75 74 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Auth;.      db->
2f00: 78 41 75 74 68 20 3d 20 30 3b 0a 23 65 6e 64 69  xAuth = 0;.#endi
2f10: 66 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  f.      rc = sql
2f20: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
2f30: 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43  ql, sqlite3InitC
2f40: 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61  allback, &initDa
2f50: 74 61 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  ta, 0);.#ifndef 
2f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2f70: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20  ORIZATION.      
2f80: 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
2f90: 68 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  h;.    }.#endif.
2fa0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fb0: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69  TE_OK ) rc = ini
2fc0: 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 73 71  tData.rc;.    sq
2fd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2fe0: 7a 53 71 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  zSql);.#ifndef S
2ff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
3000: 5a 45 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ZE.    if( rc==S
3010: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3020: 20 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69    sqlite3Analysi
3030: 73 4c 6f 61 64 28 64 62 2c 20 69 44 62 29 3b 0a  sLoad(db, iDb);.
3040: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
3050: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
3060: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
3070: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
3080: 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
3090: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
30a0: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
30b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
30c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 64  =SQLITE_OK || (d
30d0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
30e0: 4e 6f 53 63 68 65 6d 61 45 72 72 6f 72 29 29 7b  NoSchemaError)){
30f0: 0a 20 20 20 20 2f 2a 20 42 6c 61 63 6b 20 6d 61  .    /* Black ma
3100: 67 69 63 3a 20 49 66 20 74 68 65 20 53 51 4c 49  gic: If the SQLI
3110: 54 45 5f 4e 6f 53 63 68 65 6d 61 45 72 72 6f 72  TE_NoSchemaError
3120: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
3130: 65 6e 20 63 6f 6e 73 69 64 65 72 0a 20 20 20 20  en consider.    
3140: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f  ** the schema lo
3150: 61 64 65 64 2c 20 65 76 65 6e 20 69 66 20 65 72  aded, even if er
3160: 72 6f 72 73 20 6f 63 63 75 72 72 65 64 2e 20 49  rors occurred. I
3170: 6e 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e  n this situation
3180: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72   the .    ** cur
3190: 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  rent sqlite3_pre
31a0: 70 61 72 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  pare() operation
31b0: 20 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74 20   will fail, but 
31c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  the following on
31d0: 65 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 61 74  e.    ** will at
31e0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 69 6c 65  tempt to compile
31f0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 74   the supplied st
3200: 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20  atement against 
3210: 77 68 61 74 65 76 65 72 20 73 75 62 73 65 74 0a  whatever subset.
3220: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
3230: 68 65 6d 61 20 77 61 73 20 6c 6f 61 64 65 64 20  hema was loaded 
3240: 62 65 66 6f 72 65 20 74 68 65 20 65 72 72 6f 72  before the error
3250: 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 70   occurred. The p
3260: 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 70 75  rimary.    ** pu
3270: 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 69 73  rpose of this is
3280: 20 74 6f 20 61 6c 6c 6f 77 20 61 63 63 65 73 73   to allow access
3290: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   to the sqlite_m
32a0: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20  aster table.    
32b0: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 69 74 73  ** even when its
32c0: 20 63 6f 6e 74 65 6e 74 73 20 68 61 76 65 20 62   contents have b
32d0: 65 65 6e 20 63 6f 72 72 75 70 74 65 64 2e 0a 20  een corrupted.. 
32e0: 20 20 20 2a 2f 0a 20 20 20 20 44 62 53 65 74 50     */.    DbSetP
32f0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
3300: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
3310: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
3320: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
3330: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3340: 26 26 20 69 44 62 21 3d 31 20 26 26 20 28 64 62  && iDb!=1 && (db
3350: 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
3360: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 55 53 45 5f  LITE_OPEN_REUSE_
3370: 53 43 48 45 4d 41 29 20 29 7b 0a 20 20 20 20 72  SCHEMA) ){.    r
3380: 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  c = sqlite3Schem
3390: 61 43 6f 6e 6e 65 63 74 28 64 62 2c 20 69 44 62  aConnect(db, iDb
33a0: 2c 20 69 6e 69 74 44 61 74 61 2e 63 6b 73 75 6d  , initData.cksum
33b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
33c0: 70 20 68 65 72 65 20 66 6f 72 20 61 6e 20 65 72  p here for an er
33d0: 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
33e0: 61 66 74 65 72 20 73 75 63 63 65 73 73 66 75 6c  after successful
33f0: 6c 79 20 61 6c 6c 6f 63 61 74 69 6e 67 0a 20 20  ly allocating.  
3400: 2a 2a 20 63 75 72 4d 61 69 6e 20 61 6e 64 20 63  ** curMain and c
3410: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 42 74  alling sqlite3Bt
3420: 72 65 65 45 6e 74 65 72 28 29 2e 20 46 6f 72 20  reeEnter(). For 
3430: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  an error that oc
3440: 63 75 72 73 0a 20 20 2a 2a 20 62 65 66 6f 72 65  curs.  ** before
3450: 20 74 68 61 74 20 70 6f 69 6e 74 2c 20 6a 75 6d   that point, jum
3460: 70 20 74 6f 20 65 72 72 6f 72 5f 6f 75 74 2e 0a  p to error_out..
3470: 20 20 2a 2f 0a 69 6e 69 74 6f 6e 65 5f 65 72 72    */.initone_err
3480: 6f 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 6f 70  or_out:.  if( op
3490: 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20  enedTransaction 
34a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
34b0: 72 65 65 43 6f 6d 6d 69 74 28 70 44 62 2d 3e 70  reeCommit(pDb->p
34c0: 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Bt);.  }.  sqlit
34d0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 44 62  e3BtreeLeave(pDb
34e0: 2d 3e 70 42 74 29 3b 0a 0a 65 72 72 6f 72 5f 6f  ->pBt);..error_o
34f0: 75 74 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ut:.  if( rc ){.
3500: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3510: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d  TE_NOMEM || rc==
3520: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
3530: 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EM ){.      sqli
3540: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
3550: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3560: 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
3570: 28 64 62 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  (db, iDb);.  }. 
3580: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
3590: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
35a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
35b0: 6c 69 7a 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lize all databas
35c0: 65 20 66 69 6c 65 73 20 2d 20 74 68 65 20 6d 61  e files - the ma
35d0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
35e0: 2c 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 75 73  , the file.** us
35f0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70  ed to store temp
3600: 6f 72 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e  orary tables, an
3610: 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  d any additional
3620: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 0a   database files.
3630: 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ** created using
3640: 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e   ATTACH statemen
3650: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 20 73 75  ts.  Return a su
3660: 63 63 65 73 73 20 63 6f 64 65 2e 20 20 49 66 20  ccess code.  If 
3670: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  an.** error occu
3680: 72 73 2c 20 77 72 69 74 65 20 61 6e 20 65 72 72  rs, write an err
3690: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
36a0: 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  *pzErrMsg..**.**
36b0: 20 41 66 74 65 72 20 61 20 64 61 74 61 62 61 73   After a databas
36c0: 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
36d0: 2c 20 74 68 65 20 44 42 5f 53 63 68 65 6d 61 4c  , the DB_SchemaL
36e0: 6f 61 64 65 64 20 62 69 74 20 69 73 20 73 65 74  oaded bit is set
36f0: 0a 2a 2a 20 62 69 74 20 69 73 20 73 65 74 20 69  .** bit is set i
3700: 6e 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  n the flags fiel
3710: 64 20 6f 66 20 74 68 65 20 44 62 20 73 74 72 75  d of the Db stru
3720: 63 74 75 72 65 2e 20 49 66 20 74 68 65 20 64 61  cture. If the da
3730: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
3740: 61 73 20 6f 66 20 7a 65 72 6f 2d 6c 65 6e 67 74  as of zero-lengt
3750: 68 2c 20 74 68 65 6e 20 74 68 65 20 44 42 5f 45  h, then the DB_E
3760: 6d 70 74 79 20 66 6c 61 67 20 69 73 20 61 6c 73  mpty flag is als
3770: 6f 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  o set..*/.int sq
3780: 6c 69 74 65 33 49 6e 69 74 28 73 71 6c 69 74 65  lite3Init(sqlite
3790: 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 2a 70 7a  3 *db, char **pz
37a0: 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74 20 69  ErrMsg){.  int i
37b0: 2c 20 72 63 3b 0a 20 20 69 6e 74 20 63 6f 6d 6d  , rc;.  int comm
37c0: 69 74 5f 69 6e 74 65 72 6e 61 6c 20 3d 20 21 28  it_internal = !(
37d0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 26 44 42 46  db->mDbFlags&DBF
37e0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
37f0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
3800: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3810: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
3820: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3830: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
3840: 78 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  x(db->aDb[0].pBt
3850: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
3860: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
3870: 29 3b 0a 20 20 45 4e 43 28 64 62 29 20 3d 20 53  );.  ENC(db) = S
3880: 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20  CHEMA_ENC(db);. 
3890: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
38a0: 3e 30 20 29 3b 0a 20 20 2f 2a 20 44 6f 20 74 68  >0 );.  /* Do th
38b0: 65 20 6d 61 69 6e 20 73 63 68 65 6d 61 20 66 69  e main schema fi
38c0: 72 73 74 20 2a 2f 0a 20 20 69 66 28 20 21 44 62  rst */.  if( !Db
38d0: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
38e0: 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
38f0: 65 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ed) ){.    rc = 
3900: 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 64  sqlite3InitOne(d
3910: 62 2c 20 30 2c 20 70 7a 45 72 72 4d 73 67 2c 20  b, 0, pzErrMsg, 
3920: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
3930: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
3940: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73    /* All other s
3950: 63 68 65 6d 61 73 20 61 66 74 65 72 20 74 68 65  chemas after the
3960: 20 6d 61 69 6e 20 73 63 68 65 6d 61 2e 20 54 68   main schema. Th
3970: 65 20 22 74 65 6d 70 22 20 73 63 68 65 6d 61 20  e "temp" schema 
3980: 6d 75 73 74 20 62 65 20 6c 61 73 74 20 2a 2f 0a  must be last */.
3990: 20 20 66 6f 72 28 69 3d 64 62 2d 3e 6e 44 62 2d    for(i=db->nDb-
39a0: 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
39b0: 20 20 61 73 73 65 72 74 28 20 69 3d 3d 31 20 7c    assert( i==1 |
39c0: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
39d0: 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62  ldsMutex(db->aDb
39e0: 5b 69 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20  [i].pBt) );.    
39f0: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
3a00: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68  ty(db, i, DB_Sch
3a10: 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
3a20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3a30: 49 6e 69 74 4f 6e 65 28 64 62 2c 20 69 2c 20 70  InitOne(db, i, p
3a40: 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
3a50: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
3a60: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
3a70: 0a 20 20 69 66 28 20 63 6f 6d 6d 69 74 5f 69 6e  .  if( commit_in
3a80: 74 65 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ternal ){.    sq
3a90: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
3aa0: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
3ab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3ac0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3ad0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3ae0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
3af0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
3b00: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 69 74 69  is already initi
3b10: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  alized..** Other
3b20: 77 69 73 65 2c 20 74 68 65 20 73 63 68 65 6d 61  wise, the schema
3b30: 20 69 73 20 6c 6f 61 64 65 64 2e 20 41 6e 20 65   is loaded. An e
3b40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
3b50: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
3b60: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3b70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
3b80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3b90: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 20  E_OK;.  sqlite3 
3ba0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3bc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
3bd0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
3be0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
3bf0: 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
3c00: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 70  lite3Init(db, &p
3c10: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
3c20: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
3c30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3c40: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
3c50: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
3c60: 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  Err++;.    }else
3c70: 20 69 66 28 20 64 62 2d 3e 6e 6f 53 68 61 72 65   if( db->noShare
3c80: 64 43 61 63 68 65 20 26 26 20 21 49 73 52 65 75  dCache && !IsReu
3c90: 73 65 53 63 68 65 6d 61 28 64 62 29 20 29 7b 0a  seSchema(db) ){.
3ca0: 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61        db->mDbFla
3cb0: 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
3cc0: 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 20 20  emaKnownOk;.    
3cd0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
3ce0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  c;.}.../*.** Che
3cf0: 63 6b 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ck schema cookie
3d00: 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
3d10: 65 73 2e 20 20 49 66 20 61 6e 79 20 63 6f 6f 6b  es.  If any cook
3d20: 69 65 20 69 73 20 6f 75 74 0a 2a 2a 20 6f 66 20  ie is out.** of 
3d30: 64 61 74 65 20 73 65 74 20 70 50 61 72 73 65 2d  date set pParse-
3d40: 3e 72 63 20 74 6f 20 53 51 4c 49 54 45 5f 53 43  >rc to SQLITE_SC
3d50: 48 45 4d 41 2e 20 20 49 66 20 61 6c 6c 20 73 63  HEMA.  If all sc
3d60: 68 65 6d 61 20 63 6f 6f 6b 69 65 73 0a 2a 2a 20  hema cookies.** 
3d70: 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  make no changes 
3d80: 74 6f 20 70 50 61 72 73 65 2d 3e 72 63 2e 0a 2a  to pParse->rc..*
3d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 63  /.static void sc
3da0: 68 65 6d 61 49 73 56 61 6c 69 64 28 50 61 72 73  hemaIsValid(Pars
3db0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
3dc0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3dd0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
3de0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
3df0: 6e 74 20 63 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73  nt cookie;..  as
3e00: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 68  sert( pParse->ch
3e10: 65 63 6b 53 63 68 65 6d 61 20 29 3b 0a 20 20 61  eckSchema );.  a
3e20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3e30: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
3e40: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 44  tex) );.  for(iD
3e50: 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  b=0; iDb<db->nDb
3e60: 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 69 6e  ; iDb++){.    in
3e70: 74 20 6f 70 65 6e 65 64 54 72 61 6e 73 61 63 74  t openedTransact
3e80: 69 6f 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ion = 0;        
3e90: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 72   /* True if a tr
3ea0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
3eb0: 6e 65 64 20 2a 2f 0a 20 20 20 20 42 74 72 65 65  ned */.    Btree
3ec0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
3ed0: 69 44 62 5d 2e 70 42 74 3b 20 20 20 20 20 2f 2a  iDb].pBt;     /*
3ee0: 20 42 74 72 65 65 20 64 61 74 61 62 61 73 65 20   Btree database 
3ef0: 74 6f 20 72 65 61 64 20 63 6f 6f 6b 69 65 20 66  to read cookie f
3f00: 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rom */.    if( p
3f10: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
3f20: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
3f30: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
3f40: 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6f  y a read-only (o
3f50: 72 20 72 65 61 64 2d 77 72 69 74 65 29 20 74 72  r read-write) tr
3f60: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
3f70: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 62  .    ** on the b
3f80: 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
3f90: 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 49 66  open one now. If
3fa0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
3fb0: 73 20 6f 70 65 6e 65 64 2c 20 69 74 20 0a 20 20  s opened, it .  
3fc0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6c 6f    ** will be clo
3fd0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  sed immediately 
3fe0: 61 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  after reading th
3ff0: 65 20 6d 65 74 61 2d 76 61 6c 75 65 2e 20 2a 2f  e meta-value. */
4000: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
4010: 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
4020: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
4030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
4040: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
4050: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
4060: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
4070: 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OMEM || rc==SQLI
4080: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
4090: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
40a0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
40b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
40c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
40d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 6f   return;.      o
40e0: 70 65 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e  penedTransaction
40f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
4100: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 63 68   /* Read the sch
4110: 65 6d 61 20 63 6f 6f 6b 69 65 20 66 72 6f 6d 20  ema cookie from 
4120: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
4130: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   it does not mat
4140: 63 68 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 76  ch the .    ** v
4150: 61 6c 75 65 20 73 74 6f 72 65 64 20 61 73 20 70  alue stored as p
4160: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
4170: 6d 6f 72 79 20 73 63 68 65 6d 61 20 72 65 70 72  mory schema repr
4180: 65 73 65 6e 74 61 74 69 6f 6e 2c 0a 20 20 20 20  esentation,.    
4190: 2a 2a 20 73 65 74 20 50 61 72 73 65 2e 72 63 20  ** set Parse.rc 
41a0: 74 6f 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  to SQLITE_SCHEMA
41b0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
41c0: 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 42 74  BtreeGetMeta(pBt
41d0: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
41e0: 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26  ERSION, (u32 *)&
41f0: 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 61 73 73  cookie);.    ass
4200: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4210: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4220: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69  iDb, 0) );.    i
4230: 66 28 20 63 6f 6f 6b 69 65 21 3d 64 62 2d 3e 61  f( cookie!=db->a
4240: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
4250: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  >schema_cookie )
4260: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
4270: 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62  esetOneSchema(db
4280: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 70 50  , iDb);.      pP
4290: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
42a0: 45 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 7d 0a  E_SCHEMA;.    }.
42b0: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68  .    /* Close th
42c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  e transaction, i
42d0: 66 20 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65 64  f one was opened
42e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 65  . */.    if( ope
42f0: 6e 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  nedTransaction )
4300: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
4310: 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
4320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4330: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
4340: 68 65 6d 61 20 70 6f 69 6e 74 65 72 20 69 6e 74  hema pointer int
4350: 6f 20 74 68 65 20 69 44 62 20 69 6e 64 65 78 20  o the iDb index 
4360: 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 0a 2a  that indicates.*
4370: 2a 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65  * which database
4380: 20 66 69 6c 65 20 69 6e 20 64 62 2d 3e 61 44 62   file in db->aDb
4390: 5b 5d 20 74 68 65 20 73 63 68 65 6d 61 20 72 65  [] the schema re
43a0: 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49  fers to..**.** I
43b0: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
43c0: 61 73 65 20 69 73 20 61 74 74 61 63 68 65 64 20  ase is attached 
43d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20  more than once, 
43e0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 74 74  the first.** att
43f0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69  ached database i
4400: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4410: 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  nt sqlite3Schema
4420: 54 6f 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ToIndex(sqlite3 
4430: 2a 64 62 2c 20 53 63 68 65 6d 61 20 2a 70 53 63  *db, Schema *pSc
4440: 68 65 6d 61 29 7b 0a 20 20 69 6e 74 20 69 20 3d  hema){.  int i =
4450: 20 2d 31 30 30 30 30 30 30 3b 0a 0a 20 20 2f 2a   -1000000;..  /*
4460: 20 49 66 20 70 53 63 68 65 6d 61 20 69 73 20 4e   If pSchema is N
4470: 55 4c 4c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ULL, then return
4480: 20 2d 31 30 30 30 30 30 30 2e 20 54 68 69 73 20   -1000000. This 
4490: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
44a0: 65 20 69 6e 20 0a 20 20 2a 2a 20 65 78 70 72 2e  e in .  ** expr.
44b0: 63 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 72  c is trying to r
44c0: 65 73 6f 6c 76 65 20 61 20 72 65 66 65 72 65 6e  esolve a referen
44d0: 63 65 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e  ce to a transien
44e0: 74 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 6f 6e  t table (i.e. on
44f0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  e.  ** created b
4500: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2e  y a sub-select).
4510: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4520: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
4530: 66 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e  f this .  ** fun
4540: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 65 76  ction should nev
4550: 65 72 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  er be used..  **
4560: 0a 20 20 2a 2a 20 57 65 20 72 65 74 75 72 6e 20  .  ** We return 
4570: 2d 31 30 30 30 30 30 30 20 69 6e 73 74 65 61 64  -1000000 instead
4580: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 75 73 75   of the more usu
4590: 61 6c 20 2d 31 20 73 69 6d 70 6c 79 20 62 65 63  al -1 simply bec
45a0: 61 75 73 65 20 75 73 69 6e 67 0a 20 20 2a 2a 20  ause using.  ** 
45b0: 2d 31 30 30 30 30 30 30 20 61 73 20 74 68 65 20  -1000000 as the 
45c0: 69 6e 63 6f 72 72 65 63 74 20 69 6e 64 65 78 20  incorrect index 
45d0: 69 6e 74 6f 20 64 62 2d 3e 61 44 62 5b 5d 20 69  into db->aDb[] i
45e0: 73 20 6d 75 63 68 20 0a 20 20 2a 2a 20 6d 6f 72  s much .  ** mor
45f0: 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 75 73  e likely to caus
4600: 65 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 61  e a segfault tha
4610: 6e 20 2d 31 20 28 6f 66 20 63 6f 75 72 73 65 20  n -1 (of course 
4620: 74 68 65 72 65 20 61 72 65 20 61 73 73 65 72 74  there are assert
4630: 28 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  ().  ** statemen
4640: 74 73 20 74 6f 6f 2c 20 62 75 74 20 69 74 20 6e  ts too, but it n
4650: 65 76 65 72 20 68 75 72 74 73 20 74 6f 20 70 6c  ever hurts to pl
4660: 61 79 20 74 68 65 20 6f 64 64 73 29 2e 0a 20 20  ay the odds)..  
4670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
4680: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4690: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
46a0: 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20  if( pSchema ){. 
46b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 31 3b 20 69     for(i=0; 1; i
46c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
46d0: 74 28 20 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  t( i<db->nDb );.
46e0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
46f0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 53  b[i].pSchema==pS
4700: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
4710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4720: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4730: 28 20 69 3e 3d 30 20 26 26 20 69 3c 64 62 2d 3e  ( i>=0 && i<db->
4740: 6e 44 62 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  nDb );.  }.  ret
4750: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
4760: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
4770: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 74  allocations in t
4780: 68 65 20 70 50 61 72 73 65 20 6f 62 6a 65 63 74  he pParse object
4790: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
47a0: 50 61 72 73 65 72 52 65 73 65 74 28 50 61 72 73  ParserReset(Pars
47b0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
47c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
47d0: 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  se->db;.  sqlite
47e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72  3DbFree(db, pPar
47f0: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73  se->aLabel);.  s
4800: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4810: 6c 65 74 65 28 64 62 2c 20 70 50 61 72 73 65 2d  lete(db, pParse-
4820: 3e 70 43 6f 6e 73 74 45 78 70 72 29 3b 0a 20 20  >pConstExpr);.  
4830: 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
4840: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
4850: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3e 3d 20  ide.bDisable >= 
4860: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 4c  pParse->disableL
4870: 6f 6f 6b 61 73 69 64 65 20 29 3b 0a 20 20 20 20  ookaside );.    
4880: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
4890: 69 73 61 62 6c 65 20 2d 3d 20 70 50 61 72 73 65  isable -= pParse
48a0: 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69  ->disableLookasi
48b0: 64 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  de;.  }.  pParse
48c0: 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69  ->disableLookasi
48d0: 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  de = 0;.}../*.**
48e0: 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 55 54 46   Compile the UTF
48f0: 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  -8 encoded SQL s
4900: 74 61 74 65 6d 65 6e 74 20 7a 53 71 6c 20 69 6e  tatement zSql in
4910: 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68  to a statement h
4920: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
4930: 20 69 6e 74 20 73 71 6c 69 74 65 33 50 72 65 70   int sqlite3Prep
4940: 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
4950: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4960: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
4970: 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle. */.  const 
4980: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
4990: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63      /* UTF-8 enc
49a0: 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  oded SQL stateme
49b0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  nt. */.  int nBy
49c0: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
49d0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
49e0: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a  zSql in bytes. *
49f0: 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c 61 67  /.  u32 prepFlag
4a00: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
4a10: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51   Zero or more SQ
4a20: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66  LITE_PREPARE_* f
4a30: 6c 61 67 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  lags */.  Vdbe *
4a40: 70 52 65 70 72 65 70 61 72 65 2c 20 20 20 20 20  pReprepare,     
4a50: 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
4a60: 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a 20 20  reprepared */.  
4a70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
4a80: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
4a90: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
4aa0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
4ab0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
4ac0: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
4ad0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
4ae0: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
4af0: 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  g */.){.  char *
4b00: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
4b10: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
4b20: 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  sage */.  int rc
4b30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
4b40: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
4b50: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4b80: 72 20 2a 2f 0a 20 20 50 61 72 73 65 20 73 50 61  r */.  Parse sPa
4b90: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
4ba0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4bb0: 65 78 74 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74  ext */..  memset
4bc0: 28 26 73 50 61 72 73 65 2c 20 30 2c 20 50 41 52  (&sParse, 0, PAR
4bd0: 53 45 5f 48 44 52 5f 53 5a 29 3b 0a 20 20 6d 65  SE_HDR_SZ);.  me
4be0: 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28  mset(PARSE_TAIL(
4bf0: 26 73 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  &sParse), 0, PAR
4c00: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
4c10: 50 61 72 73 65 2e 70 52 65 70 72 65 70 61 72 65  Parse.pReprepare
4c20: 20 3d 20 70 52 65 70 72 65 70 61 72 65 3b 0a 20   = pReprepare;. 
4c30: 20 61 73 73 65 72 74 28 20 70 70 53 74 6d 74 20   assert( ppStmt 
4c40: 26 26 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b  && *ppStmt==0 );
4c50: 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 64  .  /* assert( !d
4c60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4c70: 29 3b 20 2f 2f 20 6e 6f 74 20 74 72 75 65 20 77  ); // not true w
4c80: 69 74 68 20 53 51 4c 49 54 45 5f 55 53 45 5f 41  ith SQLITE_USE_A
4c90: 4c 4c 4f 43 41 20 2a 2f 0a 20 20 61 73 73 65 72  LLOCA */.  asser
4ca0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4cb0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
4cc0: 20 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20   );..  /* For a 
4cd0: 6c 6f 6e 67 2d 74 65 72 6d 20 75 73 65 20 70 72  long-term use pr
4ce0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
4cf0: 20 61 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f   avoid the use o
4d00: 66 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  f.  ** lookaside
4d10: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20   memory..  */.  
4d20: 69 66 28 20 70 72 65 70 46 6c 61 67 73 20 26 20  if( prepFlags & 
4d30: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50  SQLITE_PREPARE_P
4d40: 45 52 53 49 53 54 45 4e 54 20 29 7b 0a 20 20 20  ERSISTENT ){.   
4d50: 20 73 50 61 72 73 65 2e 64 69 73 61 62 6c 65 4c   sParse.disableL
4d60: 6f 6f 6b 61 73 69 64 65 2b 2b 3b 0a 20 20 20 20  ookaside++;.    
4d70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
4d80: 69 73 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  isable++;.  }.. 
4d90: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 76 65 72   /* Check to ver
4da0: 69 66 79 20 74 68 61 74 20 69 74 20 69 73 20 70  ify that it is p
4db0: 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 61  ossible to get a
4dc0: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 61 6c   read lock on al
4dd0: 6c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  l.  ** database 
4de0: 73 63 68 65 6d 61 73 2e 20 20 54 68 65 20 69 6e  schemas.  The in
4df0: 61 62 69 6c 69 74 79 20 74 6f 20 67 65 74 20 61  ability to get a
4e00: 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 64 69 63   read lock indic
4e10: 61 74 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 73  ates that.  ** s
4e20: 6f 6d 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  ome other databa
4e30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
4e40: 20 68 6f 6c 64 69 6e 67 20 61 20 77 72 69 74 65   holding a write
4e50: 2d 6c 6f 63 6b 2c 20 77 68 69 63 68 20 69 6e 0a  -lock, which in.
4e60: 20 20 2a 2a 20 74 75 72 6e 20 6d 65 61 6e 73 20    ** turn means 
4e70: 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 63  that the other c
4e80: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6d 61  onnection has ma
4e90: 64 65 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63  de uncommitted c
4ea0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74  hanges.  ** to t
4eb0: 68 65 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2a 0a  he schema..  **.
4ec0: 20 20 2a 2a 20 57 65 72 65 20 77 65 20 74 6f 20    ** Were we to 
4ed0: 70 72 6f 63 65 65 64 20 61 6e 64 20 70 72 65 70  proceed and prep
4ee0: 61 72 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  are the statemen
4ef0: 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 75 6e  t against the un
4f00: 63 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 73  committed.  ** s
4f10: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 6e  chema changes an
4f20: 64 20 69 66 20 74 68 6f 73 65 20 73 63 68 65 6d  d if those schem
4f30: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 73 75  a changes are su
4f40: 62 73 65 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65  bsequently rolle
4f50: 64 0a 20 20 2a 2a 20 62 61 63 6b 20 61 6e 64 20  d.  ** back and 
4f60: 64 69 66 66 65 72 65 6e 74 20 63 68 61 6e 67 65  different change
4f70: 73 20 61 72 65 20 6d 61 64 65 20 69 6e 20 74 68  s are made in th
4f80: 65 69 72 20 70 6c 61 63 65 2c 20 74 68 65 6e 20  eir place, then 
4f90: 77 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70  when this.  ** p
4fa0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
4fb0: 74 20 67 6f 65 73 20 74 6f 20 72 75 6e 20 74 68  t goes to run th
4fc0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
4fd0: 77 6f 75 6c 64 20 66 61 69 6c 20 74 6f 20 64 65  would fail to de
4fe0: 74 65 63 74 0a 20 20 2a 2a 20 74 68 65 20 73 63  tect.  ** the sc
4ff0: 68 65 6d 61 20 63 68 61 6e 67 65 2e 20 20 44 69  hema change.  Di
5000: 73 61 73 74 65 72 20 77 6f 75 6c 64 20 66 6f 6c  saster would fol
5010: 6c 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  low..  **.  ** T
5020: 68 69 73 20 74 68 72 65 61 64 20 69 73 20 63 75  his thread is cu
5030: 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
5040: 6d 75 74 65 78 65 73 20 6f 6e 20 61 6c 6c 20 42  mutexes on all B
5050: 74 72 65 65 73 20 28 62 65 63 61 75 73 65 0a 20  trees (because. 
5060: 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74   ** of the sqlit
5070: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
5080: 29 20 69 6e 20 73 71 6c 69 74 65 33 4c 6f 63 6b  ) in sqlite3Lock
5090: 41 6e 64 50 72 65 70 61 72 65 28 29 29 20 73 6f  AndPrepare()) so
50a0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   it.  ** is not 
50b0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 6f  possible for ano
50c0: 74 68 65 72 20 74 68 72 65 61 64 20 74 6f 20 73  ther thread to s
50d0: 74 61 72 74 20 61 20 6e 65 77 20 73 63 68 65 6d  tart a new schem
50e0: 61 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 68  a change.  ** wh
50f0: 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ile this routine
5100: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 48 65   is running.  He
5110: 6e 63 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 6e  nce, we do not n
5120: 65 65 64 20 74 6f 20 68 6f 6c 64 20 0a 20 20 2a  eed to hold .  *
5130: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 73  * locks on the s
5140: 63 68 65 6d 61 2c 20 77 65 20 6a 75 73 74 20 6e  chema, we just n
5150: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
5160: 20 6e 6f 62 6f 64 79 20 65 6c 73 65 20 69 73 20   nobody else is 
5170: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 68  .  ** holding th
5180: 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  em..  **.  ** No
5190: 74 65 20 74 68 61 74 20 73 65 74 74 69 6e 67 20  te that setting 
51a0: 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
51b0: 20 6f 76 65 72 72 69 64 65 73 20 6d 6f 73 74 20   overrides most 
51c0: 6c 6f 63 6b 20 64 65 74 65 63 74 69 6f 6e 2c 0a  lock detection,.
51d0: 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
51e0: 20 2a 6e 6f 74 2a 20 6f 76 65 72 72 69 64 65 20   *not* override 
51f0: 73 63 68 65 6d 61 20 6c 6f 63 6b 20 64 65 74 65  schema lock dete
5200: 63 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 61  ction, so this a
5210: 6c 6c 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 77 6f  ll still.  ** wo
5220: 72 6b 73 20 65 76 65 6e 20 69 66 20 52 45 41 44  rks even if READ
5230: 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 69 73 20  _UNCOMMITTED is 
5240: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
5250: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
5260: 69 2b 2b 29 20 7b 0a 20 20 20 20 42 74 72 65 65  i++) {.    Btree
5270: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
5280: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
5290: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  pBt ){.      ass
52a0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
52b0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 29  eHoldsMutex(pBt)
52c0: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
52d0: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
52e0: 61 4c 6f 63 6b 65 64 28 70 42 74 29 3b 0a 20 20  aLocked(pBt);.  
52f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
5300: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
5310: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
5320: 69 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  i].zDbSName;.   
5330: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5340: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
5350: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
5360: 61 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22  a is locked: %s"
5370: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
5380: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 66 6c  testcase( db->fl
5390: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
53a0: 64 55 6e 63 6f 6d 6d 69 74 20 29 3b 0a 20 20 20  dUncommit );.   
53b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 72       goto end_pr
53c0: 65 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  epare;.      }. 
53d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
53e0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
53f0: 74 28 64 62 29 3b 0a 0a 20 20 73 50 61 72 73 65  t(db);..  sParse
5400: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20  .db = db;.  if( 
5410: 6e 42 79 74 65 73 3e 3d 30 20 26 26 20 28 6e 42  nBytes>=0 && (nB
5420: 79 74 65 73 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  ytes==0 || zSql[
5430: 6e 42 79 74 65 73 2d 31 5d 21 3d 30 29 20 29 7b  nBytes-1]!=0) ){
5440: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 43  .    char *zSqlC
5450: 6f 70 79 3b 0a 20 20 20 20 69 6e 74 20 6d 78 4c  opy;.    int mxL
5460: 65 6e 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  en = db->aLimit[
5470: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
5480: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 74 65  _LENGTH];.    te
5490: 73 74 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d  stcase( nBytes==
54a0: 6d 78 4c 65 6e 20 29 3b 0a 20 20 20 20 74 65 73  mxLen );.    tes
54b0: 74 63 61 73 65 28 20 6e 42 79 74 65 73 3d 3d 6d  tcase( nBytes==m
54c0: 78 4c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66  xLen+1 );.    if
54d0: 28 20 6e 42 79 74 65 73 3e 6d 78 4c 65 6e 20 29  ( nBytes>mxLen )
54e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
54f0: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
5500: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 2c 20 22  SQLITE_TOOBIG, "
5510: 73 74 61 74 65 6d 65 6e 74 20 74 6f 6f 20 6c 6f  statement too lo
5520: 6e 67 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ng");.      rc =
5530: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
5540: 64 62 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  db, SQLITE_TOOBI
5550: 47 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  G);.      goto e
5560: 6e 64 5f 70 72 65 70 61 72 65 3b 0a 20 20 20 20  nd_prepare;.    
5570: 7d 0a 20 20 20 20 7a 53 71 6c 43 6f 70 79 20 3d  }.    zSqlCopy =
5580: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
5590: 70 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42 79 74  p(db, zSql, nByt
55a0: 65 73 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  es);.    if( zSq
55b0: 6c 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73  lCopy ){.      s
55c0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
55d0: 26 73 50 61 72 73 65 2c 20 7a 53 71 6c 43 6f 70  &sParse, zSqlCop
55e0: 79 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  y, &zErrMsg);.  
55f0: 20 20 20 20 73 50 61 72 73 65 2e 7a 54 61 69 6c      sParse.zTail
5600: 20 3d 20 26 7a 53 71 6c 5b 73 50 61 72 73 65 2e   = &zSql[sParse.
5610: 7a 54 61 69 6c 2d 7a 53 71 6c 43 6f 70 79 5d 3b  zTail-zSqlCopy];
5620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5630: 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 43 6f 70  Free(db, zSqlCop
5640: 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
5650: 20 20 20 20 20 73 50 61 72 73 65 2e 7a 54 61 69       sParse.zTai
5660: 6c 20 3d 20 26 7a 53 71 6c 5b 6e 42 79 74 65 73  l = &zSql[nBytes
5670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
5680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 75 6e  {.    sqlite3Run
5690: 50 61 72 73 65 72 28 26 73 50 61 72 73 65 2c 20  Parser(&sParse, 
56a0: 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b  zSql, &zErrMsg);
56b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
56c0: 3d 3d 73 50 61 72 73 65 2e 6e 51 75 65 72 79 4c  ==sParse.nQueryL
56d0: 6f 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 73 50  oop );..  if( sP
56e0: 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  arse.rc==SQLITE_
56f0: 44 4f 4e 45 20 29 20 73 50 61 72 73 65 2e 72 63  DONE ) sParse.rc
5700: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
5710: 69 66 28 20 73 50 61 72 73 65 2e 63 68 65 63 6b  if( sParse.check
5720: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 63  Schema ){.    sc
5730: 68 65 6d 61 49 73 56 61 6c 69 64 28 26 73 50 61  hemaIsValid(&sPa
5740: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rse);.  }.  if( 
5750: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5760: 20 29 7b 0a 20 20 20 20 73 50 61 72 73 65 2e 72   ){.    sParse.r
5770: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5780: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
5790: 20 70 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 2a   pzTail ){.    *
57a0: 70 7a 54 61 69 6c 20 3d 20 73 50 61 72 73 65 2e  pzTail = sParse.
57b0: 7a 54 61 69 6c 3b 0a 20 20 7d 0a 20 20 72 63 20  zTail;.  }.  rc 
57c0: 3d 20 73 50 61 72 73 65 2e 72 63 3b 0a 0a 23 69  = sParse.rc;..#i
57d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
57e0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
57f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5800: 20 73 50 61 72 73 65 2e 70 56 64 62 65 20 26 26   sParse.pVdbe &&
5810: 20 73 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 20   sParse.explain 
5820: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
5830: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
5840: 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b   azColName[] = {
5850: 0a 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20  .       "addr", 
5860: 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
5870: 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22  "p2", "p3", "p4"
5880: 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74  , "p5", "comment
5890: 22 2c 0a 20 20 20 20 20 20 20 22 69 64 22 2c 20  ",.       "id", 
58a0: 22 70 61 72 65 6e 74 22 2c 20 22 6e 6f 74 75 73  "parent", "notus
58b0: 65 64 22 2c 20 22 64 65 74 61 69 6c 22 0a 20 20  ed", "detail".  
58c0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 46 69    };.    int iFi
58d0: 72 73 74 2c 20 6d 78 3b 0a 20 20 20 20 69 66 28  rst, mx;.    if(
58e0: 20 73 50 61 72 73 65 2e 65 78 70 6c 61 69 6e 3d   sParse.explain=
58f0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
5900: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
5910: 73 28 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20  s(sParse.pVdbe, 
5920: 34 29 3b 0a 20 20 20 20 20 20 69 46 69 72 73 74  4);.      iFirst
5930: 20 3d 20 38 3b 0a 20 20 20 20 20 20 6d 78 20 3d   = 8;.      mx =
5940: 20 31 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   12;.    }else{.
5950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5960: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 73 50 61 72  eSetNumCols(sPar
5970: 73 65 2e 70 56 64 62 65 2c 20 38 29 3b 0a 20 20  se.pVdbe, 8);.  
5980: 20 20 20 20 69 46 69 72 73 74 20 3d 20 30 3b 0a      iFirst = 0;.
5990: 20 20 20 20 20 20 6d 78 20 3d 20 38 3b 0a 20 20        mx = 8;.  
59a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 46    }.    for(i=iF
59b0: 69 72 73 74 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29  irst; i<mx; i++)
59c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
59d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 73 50  dbeSetColName(sP
59e0: 61 72 73 65 2e 70 56 64 62 65 2c 20 69 2d 69 46  arse.pVdbe, i-iF
59f0: 69 72 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  irst, COLNAME_NA
5a00: 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ME,.            
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51  azColName[i], SQ
5a30: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
5a40: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
5a50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
5a60: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
5a70: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
5a80: 73 50 61 72 73 65 2e 70 56 64 62 65 2c 20 7a 53  sParse.pVdbe, zS
5a90: 71 6c 2c 20 28 69 6e 74 29 28 73 50 61 72 73 65  ql, (int)(sParse
5aa0: 2e 7a 54 61 69 6c 2d 7a 53 71 6c 29 2c 20 70 72  .zTail-zSql), pr
5ab0: 65 70 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  epFlags);.  }.  
5ac0: 69 66 28 20 73 50 61 72 73 65 2e 70 56 64 62 65  if( sParse.pVdbe
5ad0: 20 26 26 20 28 72 63 21 3d 53 51 4c 49 54 45 5f   && (rc!=SQLITE_
5ae0: 4f 4b 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  OK || db->malloc
5af0: 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 73  Failed) ){.    s
5b00: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
5b10: 7a 65 28 73 50 61 72 73 65 2e 70 56 64 62 65 29  ze(sParse.pVdbe)
5b20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21 28 2a  ;.    assert(!(*
5b30: 70 70 53 74 6d 74 29 29 3b 0a 20 20 7d 65 6c 73  ppStmt));.  }els
5b40: 65 7b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  e{.    *ppStmt =
5b50: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29   (sqlite3_stmt*)
5b60: 73 50 61 72 73 65 2e 70 56 64 62 65 3b 0a 20 20  sParse.pVdbe;.  
5b70: 7d 0a 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  }..  if( zErrMsg
5b80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5b90: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
5ba0: 72 63 2c 20 22 25 73 22 2c 20 7a 45 72 72 4d 73  rc, "%s", zErrMs
5bb0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
5bc0: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
5bd0: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
5be0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
5bf0: 2c 20 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  , rc);.  }..  /*
5c00: 20 44 65 6c 65 74 65 20 61 6e 79 20 54 72 69 67   Delete any Trig
5c10: 67 65 72 50 72 67 20 73 74 72 75 63 74 75 72 65  gerPrg structure
5c20: 73 20 61 6c 6c 6f 63 61 74 65 64 20 77 68 69 6c  s allocated whil
5c30: 65 20 70 61 72 73 69 6e 67 20 74 68 69 73 20 73  e parsing this s
5c40: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 77  tatement. */.  w
5c50: 68 69 6c 65 28 20 73 50 61 72 73 65 2e 70 54 72  hile( sParse.pTr
5c60: 69 67 67 65 72 50 72 67 20 29 7b 0a 20 20 20 20  iggerPrg ){.    
5c70: 54 72 69 67 67 65 72 50 72 67 20 2a 70 54 20 3d  TriggerPrg *pT =
5c80: 20 73 50 61 72 73 65 2e 70 54 72 69 67 67 65 72   sParse.pTrigger
5c90: 50 72 67 3b 0a 20 20 20 20 73 50 61 72 73 65 2e  Prg;.    sParse.
5ca0: 70 54 72 69 67 67 65 72 50 72 67 20 3d 20 70 54  pTriggerPrg = pT
5cb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
5cc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5cd0: 54 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 72 65  T);.  }..end_pre
5ce0: 70 61 72 65 3a 0a 0a 20 20 73 71 6c 69 74 65 33  pare:..  sqlite3
5cf0: 50 61 72 73 65 72 52 65 73 65 74 28 26 73 50 61  ParserReset(&sPa
5d00: 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rse);.  return r
5d10: 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
5d20: 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72  sqlite3LockAndPr
5d30: 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
5d40: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
5d50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5d60: 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73  andle. */.  cons
5d70: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
5d80: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 65        /* UTF-8 e
5d90: 6e 63 6f 64 65 64 20 53 51 4c 20 73 74 61 74 65  ncoded SQL state
5da0: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ment. */.  int n
5db0: 42 79 74 65 73 2c 20 20 20 20 20 20 20 20 20 20  Bytes,          
5dc0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
5dd0: 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e  f zSql in bytes.
5de0: 20 2a 2f 0a 20 20 75 33 32 20 70 72 65 70 46 6c   */.  u32 prepFl
5df0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
5e00: 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  /* Zero or more 
5e10: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 2a  SQLITE_PREPARE_*
5e20: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 56 64 62 65   flags */.  Vdbe
5e30: 20 2a 70 4f 6c 64 2c 20 20 20 20 20 20 20 20 20   *pOld,         
5e40: 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
5e50: 67 20 72 65 70 72 65 70 61 72 65 64 20 2a 2f 0a  g reprepared */.
5e60: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
5e70: 2a 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f  *ppStmt,    /* O
5e80: 55 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  UT: A pointer to
5e90: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
5eb0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c  st char **pzTail
5ec0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
5ed0: 6e 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72  nd of parsed str
5ee0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
5ef0: 72 63 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  rc;.  int cnt = 
5f00: 30 3b 0a 20 20 69 6e 74 20 62 52 65 6c 65 61 73  0;.  int bReleas
5f10: 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 0a 23 69  eSchema = 0;..#i
5f20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5f30: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
5f40: 66 28 20 70 70 53 74 6d 74 3d 3d 30 20 29 20 72  f( ppStmt==0 ) r
5f50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
5f60: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
5f70: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
5f80: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
5f90: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 7c  fetyCheckOk(db)|
5fa0: 7c 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  |zSql==0 ){.    
5fb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5fc0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
5fd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5fe0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
5ff0: 0a 20 20 69 66 28 20 49 73 52 65 75 73 65 53 63  .  if( IsReuseSc
6000: 68 65 6d 61 28 64 62 29 20 29 7b 0a 20 20 20 20  hema(db) ){.    
6010: 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67  if( (db->mDbFlag
6020: 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d  s & DBFLAG_Schem
6030: 61 49 6e 75 73 65 29 3d 3d 30 20 29 7b 0a 20 20  aInuse)==0 ){.  
6040: 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
6050: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
6060: 61 49 6e 75 73 65 3b 0a 20 20 20 20 20 20 62 52  aInuse;.      bR
6070: 65 6c 65 61 73 65 53 63 68 65 6d 61 20 3d 20 31  eleaseSchema = 1
6080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6090: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
60a0: 6c 6c 28 64 62 29 3b 0a 20 20 64 6f 7b 0a 20 20  ll(db);.  do{.  
60b0: 20 20 2f 2a 20 4d 61 6b 65 20 6d 75 6c 74 69 70    /* Make multip
60c0: 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  le attempts to c
60d0: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 2c 20  ompile the SQL, 
60e0: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
60f0: 73 75 63 63 65 65 64 73 0a 20 20 20 20 2a 2a 20  succeeds.    ** 
6100: 6f 72 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20  or encounters a 
6110: 70 65 72 6d 61 6e 65 6e 74 20 65 72 72 6f 72 2e  permanent error.
6120: 20 20 41 20 73 63 68 65 6d 61 20 70 72 6f 62 6c    A schema probl
6130: 65 6d 20 61 66 74 65 72 20 6f 6e 65 20 73 63 68  em after one sch
6140: 65 6d 61 0a 20 20 20 20 2a 2a 20 72 65 73 65 74  ema.    ** reset
6150: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
6160: 20 70 65 72 6d 61 6e 65 6e 74 20 65 72 72 6f 72   permanent error
6170: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
6180: 6c 69 74 65 33 50 72 65 70 61 72 65 28 64 62 2c  lite3Prepare(db,
6190: 20 7a 53 71 6c 2c 20 6e 42 79 74 65 73 2c 20 70   zSql, nBytes, p
61a0: 72 65 70 46 6c 61 67 73 2c 20 70 4f 6c 64 2c 20  repFlags, pOld, 
61b0: 70 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c 29 3b  ppStmt, pzTail);
61c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
61d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a 70  =SQLITE_OK || *p
61e0: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 7d 77  pStmt==0 );.  }w
61f0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
6200: 5f 45 52 52 4f 52 5f 52 45 54 52 59 0a 20 20 20  _ERROR_RETRY.   
6210: 20 20 20 20 7c 7c 20 28 72 63 3d 3d 53 51 4c 49      || (rc==SQLI
6220: 54 45 5f 53 43 48 45 4d 41 20 26 26 20 28 73 71  TE_SCHEMA && (sq
6230: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
6240: 65 6d 61 28 64 62 2c 2d 31 29 2c 20 63 6e 74 2b  ema(db,-1), cnt+
6250: 2b 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 73 71 6c  +)==0) );..  sql
6260: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
6270: 6c 28 64 62 29 3b 0a 0a 20 20 69 66 28 20 62 52  l(db);..  if( bR
6280: 65 6c 65 61 73 65 53 63 68 65 6d 61 20 29 7b 0a  eleaseSchema ){.
6290: 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
62a0: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
62b0: 6d 61 49 6e 75 73 65 3b 0a 20 20 20 20 73 71 6c  maInuse;.    sql
62c0: 69 74 65 33 53 63 68 65 6d 61 52 65 6c 65 61 73  ite3SchemaReleas
62d0: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  eAll(db);.  }.. 
62e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
62f0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
6300: 61 73 73 65 72 74 28 20 28 72 63 26 64 62 2d 3e  assert( (rc&db->
6310: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
6320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6330: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6340: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6360: 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
6370: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 73 20 69 66  ./*.** Checks if
6380: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
6390: 6f 6b 65 6e 20 69 73 20 61 20 74 61 62 6c 65 2c  oken is a table,
63a0: 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 66 75 6e 63   column, or func
63b0: 74 69 6f 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 62 61  tion name,.** ba
63c0: 73 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  sed on the datab
63d0: 61 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ases associated 
63e0: 77 69 74 68 20 74 68 65 20 73 74 61 74 65 6d 65  with the stateme
63f0: 6e 74 20 62 65 69 6e 67 20 70 72 65 70 61 72 65  nt being prepare
6400: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e  d..** If the fun
6410: 63 74 69 6f 6e 20 66 61 69 6c 73 2c 20 7a 65 72  ction fails, zer
6420: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  o is returned an
6430: 64 20 70 52 63 20 69 73 20 66 69 6c 6c 65 64 20  d pRc is filled 
6440: 77 69 74 68 20 74 68 65 0a 2a 2a 20 65 72 72 6f  with the.** erro
6450: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
6460: 63 20 69 6e 74 20 73 68 6f 75 6c 64 54 72 65 61  c int shouldTrea
6470: 74 41 73 49 64 65 6e 74 69 66 69 65 72 28 0a 20  tAsIdentifier(. 
6480: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6490: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
64a0: 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 6f   handle. */.  co
64b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
64c0: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
64d0: 73 74 61 72 74 20 6f 66 20 74 6f 6b 65 6e 20 74  start of token t
64e0: 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
64f0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
6500: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6510: 6f 66 20 74 6f 6b 65 6e 20 74 6f 20 62 65 20 63  of token to be c
6520: 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
6530: 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
6540: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 72  /* Pointer to er
6550: 72 6f 72 20 63 6f 64 65 20 75 70 6f 6e 20 66 61  ror code upon fa
6560: 69 6c 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ilure */.){.  in
6570: 74 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20  t bFound = 0;   
6580: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
6590: 20 74 6f 6b 65 6e 20 69 73 20 61 6e 20 69 64 65   token is an ide
65a0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 2e 20 2a 2f  ntifier name. */
65b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
65c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
65d0: 73 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6c 6f  se and column lo
65e0: 6f 70 20 69 6e 64 65 78 65 73 2e 20 2a 2f 0a 20  op indexes. */. 
65f0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6600: 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 66  ;    /* Schema f
6610: 6f 72 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  or current datab
6620: 61 73 65 2e 20 2a 2f 0a 20 20 48 61 73 68 20 2a  ase. */.  Hash *
6630: 70 48 61 73 68 3b 20 20 20 20 20 20 20 20 2f 2a  pHash;        /*
6640: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 74   Hash table of t
6650: 61 62 6c 65 73 20 66 6f 72 20 63 75 72 72 65 6e  ables for curren
6660: 74 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20  t database. */. 
6670: 20 48 61 73 68 45 6c 65 6d 20 2a 65 3b 20 20 20   HashElem *e;   
6680: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65 6c 65       /* Hash ele
6690: 6d 65 6e 74 20 66 6f 72 20 68 61 73 68 20 74 61  ment for hash ta
66a0: 62 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 2a  ble iteration. *
66b0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
66c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
66d0: 61 73 65 20 74 61 62 6c 65 20 66 6f 72 20 63 6f  ase table for co
66e0: 6c 75 6d 6e 73 20 62 65 69 6e 67 20 63 68 65 63  lumns being chec
66f0: 6b 65 64 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  ked. */..  if( s
6700: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 4e 28 7a  qlite3IsRowidN(z
6710: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29  Token, nToken) )
6720: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
6730: 20 20 7d 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e    }.  if( nToken
6740: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  >0 ){.    int ha
6750: 73 68 20 3d 20 53 51 4c 49 54 45 5f 46 55 4e 43  sh = SQLITE_FUNC
6760: 5f 48 41 53 48 28 73 71 6c 69 74 65 33 55 70 70  _HASH(sqlite3Upp
6770: 65 72 54 6f 4c 6f 77 65 72 5b 28 75 38 29 7a 54  erToLower[(u8)zT
6780: 6f 6b 65 6e 5b 30 5d 5d 2c 20 6e 54 6f 6b 65 6e  oken[0]], nToken
6790: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
67a0: 65 33 46 75 6e 63 74 69 6f 6e 53 65 61 72 63 68  e3FunctionSearch
67b0: 4e 28 68 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20  N(hash, zToken, 
67c0: 6e 54 6f 6b 65 6e 29 20 29 20 72 65 74 75 72 6e  nToken) ) return
67d0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
67e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 73 71 6c  ( db!=0 );.  sql
67f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6800: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6810: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6820: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6830: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6840: 2b 2b 29 7b 0a 20 20 20 20 70 48 61 73 68 20 3d  ++){.    pHash =
6850: 20 26 64 62 2d 3e 61 46 75 6e 63 3b 0a 20 20 20   &db->aFunc;.   
6860: 20 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 68   if( sqlite3Hash
6870: 46 69 6e 64 4e 28 70 48 61 73 68 2c 20 7a 54 6f  FindN(pHash, zTo
6880: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 7b 0a  ken, nToken) ){.
6890: 20 20 20 20 20 20 62 46 6f 75 6e 64 20 3d 20 31        bFound = 1
68a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
68b0: 20 20 20 7d 0a 20 20 20 20 70 53 63 68 65 6d 61     }.    pSchema
68c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
68d0: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 70  chema;.    if( p
68e0: 53 63 68 65 6d 61 3d 3d 30 20 29 20 63 6f 6e 74  Schema==0 ) cont
68f0: 69 6e 75 65 3b 0a 20 20 20 20 70 48 61 73 68 20  inue;.    pHash 
6900: 3d 20 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  = &pSchema->tblH
6910: 61 73 68 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ash;.    if( sql
6920: 69 74 65 33 48 61 73 68 46 69 6e 64 4e 28 70 48  ite3HashFindN(pH
6930: 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  ash, zToken, nTo
6940: 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 62 46  ken) ){.      bF
6950: 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
6960: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6970: 20 66 6f 72 28 65 3d 73 71 6c 69 74 65 48 61 73   for(e=sqliteHas
6980: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 65  hFirst(pHash); e
6990: 3b 20 65 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; e=sqliteHashNe
69a0: 78 74 28 65 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(e)){.      pT
69b0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
69c0: 61 74 61 28 65 29 3b 0a 20 20 20 20 20 20 69 66  ata(e);.      if
69d0: 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pTab==0 ) cont
69e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 48 61 73  inue;.      pHas
69f0: 68 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6c 48 61  h = pTab->pColHa
6a00: 73 68 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  sh;.      if( pH
6a10: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
6a20: 20 20 70 54 61 62 2d 3e 70 43 6f 6c 48 61 73 68    pTab->pColHash
6a30: 20 3d 20 70 48 61 73 68 20 3d 20 73 71 6c 69 74   = pHash = sqlit
6a40: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
6a50: 28 48 61 73 68 29 29 3b 0a 20 20 20 20 20 20 20  (Hash));.       
6a60: 20 69 66 28 20 70 48 61 73 68 20 29 7b 0a 20 20   if( pHash ){.  
6a70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
6a80: 61 73 68 49 6e 69 74 28 70 48 61 73 68 29 3b 0a  ashInit(pHash);.
6a90: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
6aa0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
6ab0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6ac0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
6ad0: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  = &pTab->aCol[j]
6ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
6af0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
6b00: 70 48 61 73 68 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  pHash, pCol->zNa
6b10: 6d 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 20  me, pCol);.     
6b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6b30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6b40: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
6b50: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
6b60: 20 20 20 20 62 46 6f 75 6e 64 20 3d 20 30 3b 0a      bFound = 0;.
6b70: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
6b80: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  one;.        }. 
6b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6ba0: 20 70 48 61 73 68 20 26 26 20 73 71 6c 69 74 65   pHash && sqlite
6bb0: 33 48 61 73 68 46 69 6e 64 4e 28 70 48 61 73 68  3HashFindN(pHash
6bc0: 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , zToken, nToken
6bd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 46 6f  ) ){.        bFo
6be0: 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
6bf0: 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20   goto done;.    
6c00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 64 6f    }.    }.  }.do
6c10: 6e 65 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ne:.  sqlite3Btr
6c20: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
6c30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6c40: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6c50: 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6f 75 6e  ;.  return bFoun
6c60: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  d;.}../*.** Atte
6c70: 6d 70 74 20 74 6f 20 65 73 74 69 6d 61 74 65 20  mpt to estimate 
6c80: 74 68 65 20 66 69 6e 61 6c 20 6f 75 74 70 75 74  the final output
6c90: 20 62 75 66 66 65 72 20 73 69 7a 65 20 6e 65 65   buffer size nee
6ca0: 64 65 64 20 66 6f 72 20 74 68 65 20 66 75 6c 6c  ded for the full
6cb0: 79 0a 2a 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20  y.** normalized 
6cc0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
6cd0: 70 65 63 69 66 69 65 64 20 53 51 4c 20 73 74 72  pecified SQL str
6ce0: 69 6e 67 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ing.  This shoul
6cf0: 64 20 74 61 6b 65 20 69 6e 74 6f 0a 2a 2a 20 61  d take into.** a
6d00: 63 63 6f 75 6e 74 20 61 6e 79 20 70 6f 74 65 6e  ccount any poten
6d10: 74 69 61 6c 20 65 78 70 61 6e 73 69 6f 6e 20 74  tial expansion t
6d20: 68 61 74 20 63 6f 75 6c 64 20 6f 63 63 75 72 20  hat could occur 
6d30: 28 65 2e 67 2e 20 76 69 61 20 49 4e 20 63 6c 61  (e.g. via IN cla
6d40: 75 73 65 73 0a 2a 2a 20 62 65 69 6e 67 20 65 78  uses.** being ex
6d50: 70 61 6e 64 65 64 2c 20 65 74 63 29 2e 20 20 54  panded, etc).  T
6d60: 68 69 73 20 73 69 7a 65 20 72 65 74 75 72 6e 65  his size returne
6d70: 64 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  d is the total n
6d80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
6d90: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
6da0: 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  NUL terminator..
6db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 73  */.static int es
6dc0: 74 69 6d 61 74 65 4e 6f 72 6d 61 6c 69 7a 65 64  timateNormalized
6dd0: 53 69 7a 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Size(.  const ch
6de0: 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a 20 54 68 65  ar *zSql, /* The
6df0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
6e00: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ring */.  int nS
6e10: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ql,         /* L
6e20: 65 6e 67 74 68 20 6f 66 20 6f 72 69 67 69 6e 61  ength of origina
6e30: 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  l SQL string */.
6e40: 20 20 75 38 20 70 72 65 70 46 6c 61 67 73 20 20    u8 prepFlags  
6e50: 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73      /* The flags
6e60: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
6e70: 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 29 20  e3_prepare_v3() 
6e80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f 75 74  */.){.  int nOut
6e90: 20 3d 20 6e 53 71 6c 20 2b 20 34 3b 0a 20 20 63   = nSql + 4;.  c
6ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
6eb0: 53 71 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  Sql;.  while( nO
6ec0: 75 74 3c 6e 53 71 6c 2a 35 20 29 7b 0a 20 20 20  ut<nSql*5 ){.   
6ed0: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d 30 20   while( z[0]!=0 
6ee0: 26 26 20 7a 5b 30 5d 21 3d 27 49 27 20 26 26 20  && z[0]!='I' && 
6ef0: 7a 5b 30 5d 21 3d 27 69 27 20 29 7b 20 7a 2b 2b  z[0]!='i' ){ z++
6f00: 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ; }.    if( z[0]
6f10: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6f20: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b   z++;.    if( z[
6f30: 30 5d 21 3d 27 4e 27 20 26 26 20 7a 5b 30 5d 21  0]!='N' && z[0]!
6f40: 3d 27 6e 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='n' ) break;.  
6f50: 20 20 7a 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65    z++;.    while
6f60: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
6f70: 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d  (z[0]) ){ z++; }
6f80: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
6f90: 28 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  (' ) break;.    
6fa0: 7a 2b 2b 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  z++;.    nOut +=
6fb0: 20 35 3b 20 2f 2a 20 3f 2c 3f 2c 3f 20 2a 2f 0a   5; /* ?,?,? */.
6fc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 4f 75    }.  return nOu
6fd0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  t;.}../*.** Copy
6fe0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 6f 6b   the current tok
6ff0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  en into the outp
7000: 75 74 20 62 75 66 66 65 72 20 77 68 69 6c 65 20  ut buffer while 
7010: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 71 75 6f  dealing with quo
7020: 74 65 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ted.** identifie
7030: 72 73 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  rs.  By default,
7040: 20 61 6c 6c 20 6c 65 74 74 65 72 73 20 77 69 6c   all letters wil
7050: 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
7060: 6e 74 6f 20 6c 6f 77 65 72 63 61 73 65 2e 0a 2a  nto lowercase..*
7070: 2a 20 49 66 20 74 68 65 20 62 55 70 70 65 72 20  * If the bUpper 
7080: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 75 70 70  flag is set, upp
7090: 65 72 63 61 73 65 20 77 69 6c 6c 20 62 65 20 75  ercase will be u
70a0: 73 65 64 2e 20 20 54 68 65 20 70 69 4f 75 74 20  sed.  The piOut 
70b0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 77 69 6c 6c  argument.** will
70c0: 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64 61   be used to upda
70d0: 74 65 20 74 68 65 20 74 61 72 67 65 74 20 69 6e  te the target in
70e0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  dex into the out
70f0: 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  put string..*/.s
7100: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e  tatic void copyN
7110: 6f 72 6d 61 6c 69 7a 65 64 54 6f 6b 65 6e 28 0a  ormalizedToken(.
7120: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7130: 71 6c 2c 20 2f 2a 20 54 68 65 20 6f 72 69 67 69  ql, /* The origi
7140: 6e 61 6c 20 53 51 4c 20 73 74 72 69 6e 67 20 2a  nal SQL string *
7150: 2f 0a 20 20 69 6e 74 20 69 49 6e 2c 20 20 20 20  /.  int iIn,    
7160: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7170: 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
7180: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 72  original SQL str
7190: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ing */.  int nTo
71a0: 6b 65 6e 2c 20 20 20 20 20 20 20 2f 2a 20 4e 75  ken,       /* Nu
71b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
71c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 6f 6b   the current tok
71d0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  en */.  int toke
71e0: 6e 46 6c 61 67 73 2c 20 20 20 2f 2a 20 46 6c 61  nFlags,   /* Fla
71f0: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  gs returned by t
7200: 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f 0a  he tokenizer */.
7210: 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20    char *zOut,   
7220: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
7230: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  t string */.  in
7240: 74 20 2a 70 69 4f 75 74 20 20 20 20 20 20 20 20  t *piOut        
7250: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 61  /* Pointer to ta
7260: 72 67 65 74 20 69 6e 64 65 78 20 69 6e 74 6f 20  rget index into 
7270: 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e  the output strin
7280: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 51  g */.){.  int bQ
7290: 75 6f 74 65 64 20 3d 20 74 6f 6b 65 6e 46 6c 61  uoted = tokenFla
72a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 54 4f 4b 45  gs & SQLITE_TOKE
72b0: 4e 5f 51 55 4f 54 45 44 3b 0a 20 20 69 6e 74 20  N_QUOTED;.  int 
72c0: 62 4b 65 79 77 6f 72 64 20 3d 20 74 6f 6b 65 6e  bKeyword = token
72d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54  Flags & SQLITE_T
72e0: 4f 4b 45 4e 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  OKEN_KEYWORD;.  
72f0: 69 6e 74 20 6a 20 3d 20 2a 70 69 4f 75 74 2c 20  int j = *piOut, 
7300: 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 20 6b  k = 0;.  for(; k
7310: 3c 6e 54 6f 6b 65 6e 3b 20 6b 2b 2b 29 7b 0a 20  <nToken; k++){. 
7320: 20 20 20 69 66 28 20 62 51 75 6f 74 65 64 20 29     if( bQuoted )
7330: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  {.      if( k==0
7340: 20 26 26 20 69 49 6e 3e 30 20 29 7b 0a 20 20 20   && iIn>0 ){.   
7350: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
7360: 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 63 6f   '"';.        co
7370: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
7380: 6c 73 65 20 69 66 28 20 6b 3d 3d 6e 54 6f 6b 65  lse if( k==nToke
7390: 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  n-1 ){.        z
73a0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 27 22 27 3b 0a  Out[j++] = '"';.
73b0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
73c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
73d0: 20 20 20 20 69 66 28 20 62 4b 65 79 77 6f 72 64      if( bKeyword
73e0: 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a   ){.      zOut[j
73f0: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 75  ++] = sqlite3Tou
7400: 70 70 65 72 28 7a 53 71 6c 5b 69 49 6e 2b 6b 5d  pper(zSql[iIn+k]
7410: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7420: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
7430: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a  sqlite3Tolower(z
7440: 53 71 6c 5b 69 49 6e 2b 6b 5d 29 3b 0a 20 20 20  Sql[iIn+k]);.   
7450: 20 7d 0a 20 20 7d 0a 20 20 2a 70 69 4f 75 74 20   }.  }.  *piOut 
7460: 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 65  = j;.}../*.** Pe
7470: 72 66 6f 72 6d 20 6e 6f 72 6d 61 6c 69 7a 61 74  rform normalizat
7480: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 20 63  ion of the SQL c
7490: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
74a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
74b0: 6e 74 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  nt and.** store 
74c0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68  the result in th
74d0: 65 20 7a 4e 6f 72 6d 53 71 6c 20 66 69 65 6c 64  e zNormSql field
74e0: 2e 20 20 54 68 65 20 73 63 68 65 6d 61 20 66 6f  .  The schema fo
74f0: 72 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  r the associated
7500: 0a 2a 2a 20 64 61 74 61 62 61 73 65 73 20 61 72  .** databases ar
7510: 65 20 63 6f 6e 73 75 6c 74 65 64 20 77 68 69 6c  e consulted whil
7520: 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 74 68 65  e performing the
7530: 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 69   normalization i
7540: 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 64 65  n order to.** de
7550: 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 6f 6b  termine if a tok
7560: 65 6e 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  en appears to be
7570: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 20   an identifier. 
7580: 20 41 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   All identifiers
7590: 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20 69 6e 74   are.** left int
75a0: 61 63 74 20 69 6e 20 74 68 65 20 6e 6f 72 6d 61  act in the norma
75b0: 6c 69 7a 65 64 20 53 51 4c 20 61 6e 64 20 61 6c  lized SQL and al
75c0: 6c 20 6c 69 74 65 72 61 6c 73 20 61 72 65 20 72  l literals are r
75d0: 65 70 6c 61 63 65 64 20 77 69 74 68 20 61 0a 2a  eplaced with a.*
75e0: 2a 20 73 69 6e 67 6c 65 20 27 3f 27 2e 0a 2a 2f  * single '?'..*/
75f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 6f 72  .void sqlite3Nor
7600: 6d 61 6c 69 7a 65 28 0a 20 20 56 64 62 65 20 2a  malize(.  Vdbe *
7610: 70 56 64 62 65 2c 20 20 20 20 20 20 2f 2a 20 56  pVdbe,      /* V
7620: 4d 20 62 65 69 6e 67 20 72 65 70 72 65 70 61 72  M being reprepar
7630: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7640: 61 72 20 2a 7a 53 71 6c 2c 20 2f 2a 20 54 68 65  ar *zSql, /* The
7650: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
7660: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ring */.  int nS
7670: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ql,         /* S
7680: 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ize of the input
7690: 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73   string in bytes
76a0: 20 2a 2f 0a 20 20 75 38 20 70 72 65 70 46 6c 61   */.  u8 prepFla
76b0: 67 73 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  gs      /* The f
76c0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
76d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
76e0: 33 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  3() */.){.  sqli
76f0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
7700: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
7710: 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63 68 61 72  andle. */.  char
7720: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
7730: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
7740: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
7750: 20 6e 5a 3b 20 20 20 20 20 20 20 20 20 20 20 20   nZ;            
7760: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
7770: 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  he output string
7780: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7790: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
77a0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 68        /* Next ch
77b0: 61 72 61 63 74 65 72 20 74 6f 20 72 65 61 64 20  aracter to read 
77c0: 66 72 6f 6d 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  from zSql[] */. 
77d0: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
77e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
77f0: 63 68 61 72 61 63 74 65 72 20 74 6f 20 66 69 6c  character to fil
7800: 6c 20 69 6e 20 6f 6e 20 7a 5b 5d 20 2a 2f 0a 20  l in on z[] */. 
7810: 20 69 6e 74 20 74 6f 6b 65 6e 54 79 70 65 20 3d   int tokenType =
7820: 20 30 3b 20 20 20 20 20 2f 2a 20 54 79 70 65 20   0;     /* Type 
7830: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65  of the next toke
7840: 6e 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 76 54  n */.  int prevT
7850: 6f 6b 65 6e 54 79 70 65 20 3d 20 30 3b 20 2f 2a  okenType = 0; /*
7860: 20 54 79 70 65 20 6f 66 20 74 68 65 20 70 72 65   Type of the pre
7870: 76 69 6f 75 73 20 74 6f 6b 65 6e 2c 20 65 78 63  vious token, exc
7880: 65 70 74 20 73 70 61 63 65 73 20 2a 2f 0a 20 20  ept spaces */.  
7890: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
78a0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
78b0: 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e  f the next token
78c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 65 6e   */.  int nParen
78d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
78e0: 4e 65 73 74 69 6e 67 20 6c 65 76 65 6c 20 6f 66  Nesting level of
78f0: 20 70 61 72 65 6e 74 68 65 73 69 73 20 2a 2f 0a   parenthesis */.
7900: 20 20 48 61 73 68 20 69 6e 48 61 73 68 3b 20 20    Hash inHash;  
7910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7920: 65 20 6f 66 20 70 61 72 65 6e 74 68 65 73 69 73  e of parenthesis
7930: 20 6c 65 76 65 6c 73 20 74 6f 20 6f 75 74 70 75   levels to outpu
7940: 74 20 69 6e 64 65 78 2e 20 2a 2f 0a 0a 20 20 64  t index. */..  d
7950: 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 44  b = sqlite3VdbeD
7960: 62 28 70 56 64 62 65 29 3b 0a 20 20 61 73 73 65  b(pVdbe);.  asse
7970: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
7980: 73 73 65 72 74 28 20 70 56 64 62 65 2d 3e 7a 4e  ssert( pVdbe->zN
7990: 6f 72 6d 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 69  ormSql==0 );.  i
79a0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
79b0: 75 72 6e 3b 0a 20 20 6e 5a 20 3d 20 65 73 74 69  urn;.  nZ = esti
79c0: 6d 61 74 65 4e 6f 72 6d 61 6c 69 7a 65 64 53 69  mateNormalizedSi
79d0: 7a 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 2c 20 70  ze(zSql, nSql, p
79e0: 72 65 70 46 6c 61 67 73 29 3b 0a 20 20 7a 20 3d  repFlags);.  z =
79f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7a00: 52 61 77 4e 4e 28 64 62 2c 20 6e 5a 29 3b 0a 20  RawNN(db, nZ);. 
7a10: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
7a20: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73  rn;.  sqlite3Has
7a30: 68 49 6e 69 74 28 26 69 6e 48 61 73 68 29 3b 0a  hInit(&inHash);.
7a40: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
7a50: 53 71 6c 20 26 26 20 7a 53 71 6c 5b 69 5d 3b 20  Sql && zSql[i]; 
7a60: 69 2b 3d 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66  i+=n){.    int f
7a70: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  lags = 0;.    if
7a80: 28 20 74 6f 6b 65 6e 54 79 70 65 21 3d 54 4b 5f  ( tokenType!=TK_
7a90: 53 50 41 43 45 20 29 20 70 72 65 76 54 6f 6b 65  SPACE ) prevToke
7aa0: 6e 54 79 70 65 20 3d 20 74 6f 6b 65 6e 54 79 70  nType = tokenTyp
7ab0: 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  e;.    n = sqlit
7ac0: 65 33 47 65 74 54 6f 6b 65 6e 4e 6f 72 6d 61 6c  e3GetTokenNormal
7ad0: 69 7a 65 64 28 28 75 6e 73 69 67 6e 65 64 20 63  ized((unsigned c
7ae0: 68 61 72 2a 29 7a 53 71 6c 2b 69 2c 20 26 74 6f  har*)zSql+i, &to
7af0: 6b 65 6e 54 79 70 65 2c 20 26 66 6c 61 67 73 29  kenType, &flags)
7b00: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 6f  ;.    switch( to
7b10: 6b 65 6e 54 79 70 65 20 29 7b 0a 20 20 20 20 20  kenType ){.     
7b20: 20 63 61 73 65 20 54 4b 5f 53 50 41 43 45 3a 20   case TK_SPACE: 
7b30: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
7b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
7b50: 61 73 65 20 54 4b 5f 49 4c 4c 45 47 41 4c 3a 20  ase TK_ILLEGAL: 
7b60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b70: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
7b80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
7b90: 61 73 68 43 6c 65 61 72 28 26 69 6e 48 61 73 68  ashClear(&inHash
7ba0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
7bb0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
7bc0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
7bd0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
7be0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 63 61  NTEGER:.      ca
7bf0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
7c00: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
7c10: 42 4c 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20  BLE:.      case 
7c20: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
7c30: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b     z[j++] = '?';
7c40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7c60: 73 65 20 54 4b 5f 4c 50 3a 0a 20 20 20 20 20 20  se TK_LP:.      
7c70: 63 61 73 65 20 54 4b 5f 52 50 3a 20 7b 0a 20 20  case TK_RP: {.  
7c80: 20 20 20 20 20 20 69 66 28 20 74 6f 6b 65 6e 54        if( tokenT
7c90: 79 70 65 3d 3d 54 4b 5f 4c 50 20 29 7b 0a 20 20  ype==TK_LP ){.  
7ca0: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b          nParen++
7cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7cc0: 70 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d 3d 54  prevTokenType==T
7cd0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  K_IN ){.        
7ce0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 72      assert( nPar
7cf0: 65 6e 3c 6e 53 71 6c 20 29 3b 0a 20 20 20 20 20  en<nSql );.     
7d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
7d10: 73 68 49 6e 73 65 72 74 28 26 69 6e 48 61 73 68  shInsert(&inHash
7d20: 2c 20 7a 53 71 6c 2b 6e 50 61 72 65 6e 2c 20 53  , zSql+nParen, S
7d30: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
7d40: 28 6a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (j));.          
7d50: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
7d60: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
7d70: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  j;.          ass
7d80: 65 72 74 28 20 6e 50 61 72 65 6e 3c 6e 53 71 6c  ert( nParen<nSql
7d90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6a   );.          jj
7da0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
7db0: 5f 49 4e 54 28 73 71 6c 69 74 65 33 48 61 73 68  _INT(sqlite3Hash
7dc0: 46 69 6e 64 28 26 69 6e 48 61 73 68 2c 20 7a 53  Find(&inHash, zS
7dd0: 71 6c 2b 6e 50 61 72 65 6e 29 29 3b 0a 20 20 20  ql+nParen));.   
7de0: 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 30 20         if( jj>0 
7df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
7e00: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
7e10: 28 26 69 6e 48 61 73 68 2c 20 7a 53 71 6c 2b 6e  (&inHash, zSql+n
7e20: 50 61 72 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Paren, 0);.     
7e30: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
7e40: 6a 2b 36 3c 6e 5a 20 29 3b 0a 20 20 20 20 20 20  j+6<nZ );.      
7e50: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2b 6a        memcpy(z+j
7e60: 6a 2b 31 2c 20 22 3f 2c 3f 2c 3f 22 2c 20 35 29  j+1, "?,?,?", 5)
7e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20  ;.            j 
7e80: 3d 20 6a 6a 2b 36 3b 0a 20 20 20 20 20 20 20 20  = jj+6;.        
7e90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 2d 31      assert( nZ-1
7ea0: 2d 6a 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  -j>=0 );.       
7eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 2d       assert( nZ-
7ec0: 31 2d 6a 3c 6e 5a 20 29 3b 0a 20 20 20 20 20 20  1-j<nZ );.      
7ed0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 2b 6a        memset(z+j
7ee0: 2c 20 30 2c 20 6e 5a 2d 31 2d 6a 29 3b 0a 20 20  , 0, nZ-1-j);.  
7ef0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7f00: 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20      nParen--;.  
7f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7f20: 61 73 73 65 72 74 28 20 6e 50 61 72 65 6e 3e 3d  assert( nParen>=
7f30: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
7f40: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
7f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7f60: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
7f70: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4d 49 3a     case TK_SEMI:
7f80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 50  .      case TK_P
7f90: 4c 55 53 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LUS:.      case 
7fa0: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 20 20 63  TK_STAR:.      c
7fb0: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
7fc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
7fd0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45  .      case TK_E
7fe0: 51 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  Q:.      case TK
7ff0: 5f 4c 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20  _LE:.      case 
8000: 54 4b 5f 4e 45 3a 0a 20 20 20 20 20 20 63 61 73  TK_NE:.      cas
8010: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
8020: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
8030: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48       case TK_RSH
8040: 49 46 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  IFT:.      case 
8050: 54 4b 5f 47 54 3a 0a 20 20 20 20 20 20 63 61 73  TK_GT:.      cas
8060: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 63  e TK_GE:.      c
8070: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
8080: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
8090: 41 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  AT:.      case T
80a0: 4b 5f 43 4f 4d 4d 41 3a 0a 20 20 20 20 20 20 63  K_COMMA:.      c
80b0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
80c0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54       case TK_BIT
80d0: 4e 4f 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NOT:.      case 
80e0: 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 20 20 63 61  TK_DOT:.      ca
80f0: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
8100: 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
8110: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
8120: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c       case TK_NUL
8130: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  L:.      case TK
8140: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  _ID: {.        i
8150: 66 28 20 74 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b  f( tokenType==TK
8160: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  _NULL ){.       
8170: 20 20 20 69 66 28 20 70 72 65 76 54 6f 6b 65 6e     if( prevToken
8180: 54 79 70 65 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  Type==TK_IS || p
8190: 72 65 76 54 6f 6b 65 6e 54 79 70 65 3d 3d 54 4b  revTokenType==TK
81a0: 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _NOT ){.        
81b0: 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 69 73 20 61      /* NULL is a
81c0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 69 73   keyword in this
81d0: 20 63 61 73 65 2c 20 6e 6f 74 20 61 20 6c 69 74   case, not a lit
81e0: 65 72 61 6c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  eral value */.  
81f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
8210: 72 65 20 74 68 65 20 4e 55 4c 4c 20 69 73 20 61  re the NULL is a
8220: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20 2a   literal value *
8230: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b  /.            z[
8240: 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
8250: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8260: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8270: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8280: 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49   j>0 && sqlite3I
8290: 73 49 64 43 68 61 72 28 7a 5b 6a 2d 31 5d 29 20  sIdChar(z[j-1]) 
82a0: 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43 68  && sqlite3IsIdCh
82b0: 61 72 28 7a 53 71 6c 5b 69 5d 29 20 29 7b 0a 20  ar(zSql[i]) ){. 
82c0: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
82d0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
82e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 6b  .        if( tok
82f0: 65 6e 54 79 70 65 3d 3d 54 4b 5f 49 44 20 29 7b  enType==TK_ID ){
8300: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
8310: 32 20 3d 20 69 2c 20 6e 32 20 3d 20 6e 2c 20 72  2 = i, n2 = n, r
8320: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8330: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61           if( nPa
8340: 72 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ren>0 ){.       
8350: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61       assert( nPa
8360: 72 65 6e 3c 6e 53 71 6c 20 29 3b 0a 20 20 20 20  ren<nSql );.    
8370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
8380: 61 73 68 49 6e 73 65 72 74 28 26 69 6e 48 61 73  ashInsert(&inHas
8390: 68 2c 20 7a 53 71 6c 2b 6e 50 61 72 65 6e 2c 20  h, zSql+nParen, 
83a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
83b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c            if( fl
83c0: 61 67 73 26 53 51 4c 49 54 45 5f 54 4f 4b 45 4e  ags&SQLITE_TOKEN
83d0: 5f 51 55 4f 54 45 44 20 29 7b 20 69 32 2b 2b 3b  _QUOTED ){ i2++;
83e0: 20 6e 32 2d 3d 32 3b 20 7d 0a 20 20 20 20 20 20   n2-=2; }.      
83f0: 20 20 20 20 69 66 28 20 73 68 6f 75 6c 64 54 72      if( shouldTr
8400: 65 61 74 41 73 49 64 65 6e 74 69 66 69 65 72 28  eatAsIdentifier(
8410: 64 62 2c 20 7a 53 71 6c 2b 69 32 2c 20 6e 32 2c  db, zSql+i2, n2,
8420: 20 26 72 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20   &rc)==0 ){.    
8430: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
8440: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8450: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8460: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
8470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8480: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
8490: 26 69 6e 48 61 73 68 29 3b 0a 20 20 20 20 20 20  &inHash);.      
84a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
84c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
84d0: 6c 69 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68  lite3_keyword_ch
84e0: 65 63 6b 28 7a 53 71 6c 2b 69 32 2c 20 6e 32 29  eck(zSql+i2, n2)
84f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8500: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f       z[j++] = '?
8510: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ';.             
8520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8540: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8550: 20 20 20 20 63 6f 70 79 4e 6f 72 6d 61 6c 69 7a      copyNormaliz
8560: 65 64 54 6f 6b 65 6e 28 7a 53 71 6c 2c 20 69 2c  edToken(zSql, i,
8570: 20 6e 2c 20 66 6c 61 67 73 2c 20 7a 2c 20 26 6a   n, flags, z, &j
8580: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
8590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
85a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3c    }.  assert( j<
85b0: 6e 5a 20 26 26 20 22 6f 6e 65 22 20 29 3b 0a 20  nZ && "one" );. 
85c0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
85d0: 5b 6a 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6a 2d  [j-1]==' ' ){ j-
85e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6a 3e 30 20 26  -; }.  if( j>0 &
85f0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 3b 27 20 29 7b  & z[j-1]!=';' ){
8600: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3b 27 3b 20 7d   z[j++] = ';'; }
8610: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61  .  z[j] = 0;.  a
8620: 73 73 65 72 74 28 20 6a 3c 6e 5a 20 26 26 20 22  ssert( j<nZ && "
8630: 74 77 6f 22 20 29 3b 0a 20 20 70 56 64 62 65 2d  two" );.  pVdbe-
8640: 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 7a 3b 0a 20  >zNormSql = z;. 
8650: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
8660: 72 28 26 69 6e 48 61 73 68 29 3b 0a 7d 0a 23 65  r(&inHash);.}.#e
8670: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
8680: 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 20  NABLE_NORMALIZE 
8690: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 72 75 6e 20  */../*.** Rerun 
86a0: 74 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  the compilation 
86b0: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 61  of a statement a
86c0: 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63 68  fter a schema ch
86d0: 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ange..**.** If t
86e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
86f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 63  successfully rec
8700: 6f 6d 70 69 6c 65 64 2c 20 72 65 74 75 72 6e 20  ompiled, return 
8710: 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
8720: 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  wise,.** if the 
8730: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
8740: 20 62 65 20 72 65 63 6f 6d 70 69 6c 65 64 20 62   be recompiled b
8750: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20 63  ecause another c
8760: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 2a 2a  onnection has.**
8770: 20 6c 6f 63 6b 65 64 20 74 68 65 20 73 71 6c 69   locked the sqli
8780: 74 65 33 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  te3_master table
8790: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
87a0: 4c 4f 43 4b 45 44 2e 20 49 66 20 61 6e 79 20 6f  LOCKED. If any o
87b0: 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  ther error.** oc
87c0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  curs, return SQL
87d0: 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a 2f 0a 69  ITE_SCHEMA..*/.i
87e0: 6e 74 20 73 71 6c 69 74 65 33 52 65 70 72 65 70  nt sqlite3Reprep
87f0: 61 72 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  are(Vdbe *p){.  
8800: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
8810: 33 5f 73 74 6d 74 20 2a 70 4e 65 77 3b 0a 20 20  3_stmt *pNew;.  
8820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
8830: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8840: 0a 20 20 75 38 20 70 72 65 70 46 6c 61 67 73 3b  .  u8 prepFlags;
8850: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8860: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
8870: 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 2d  qlite3VdbeDb(p)-
8880: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 7a 53 71  >mutex) );.  zSq
8890: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
88a0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29  (sqlite3_stmt *)
88b0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53  p);.  assert( zS
88c0: 71 6c 21 3d 30 20 29 3b 20 20 2f 2a 20 52 65 70  ql!=0 );  /* Rep
88d0: 72 65 70 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  repare only call
88e0: 65 64 20 66 6f 72 20 70 72 65 70 61 72 65 5f 76  ed for prepare_v
88f0: 32 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  2() statements *
8900: 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  /.  db = sqlite3
8910: 56 64 62 65 44 62 28 70 29 3b 0a 20 20 61 73 73  VdbeDb(p);.  ass
8920: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8930: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
8940: 78 29 20 29 3b 0a 20 20 70 72 65 70 46 6c 61 67  x) );.  prepFlag
8950: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 50  s = sqlite3VdbeP
8960: 72 65 70 61 72 65 46 6c 61 67 73 28 70 29 3b 0a  repareFlags(p);.
8970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
8980: 63 6b 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c  ckAndPrepare(db,
8990: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 72 65 70 46   zSql, -1, prepF
89a0: 6c 61 67 73 2c 20 70 2c 20 26 70 4e 65 77 2c 20  lags, p, &pNew, 
89b0: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
89c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
89d0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
89e0: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
89f0: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t(db);.    }.   
8a00: 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30   assert( pNew==0
8a10: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   );.    return r
8a20: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
8a30: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
8a40: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8a50: 56 64 62 65 53 77 61 70 28 28 56 64 62 65 2a 29  VdbeSwap((Vdbe*)
8a60: 70 4e 65 77 2c 20 70 29 3b 0a 20 20 73 71 6c 69  pNew, p);.  sqli
8a70: 74 65 33 54 72 61 6e 73 66 65 72 42 69 6e 64 69  te3TransferBindi
8a80: 6e 67 73 28 70 4e 65 77 2c 20 28 73 71 6c 69 74  ngs(pNew, (sqlit
8a90: 65 33 5f 73 74 6d 74 2a 29 70 29 3b 0a 20 20 73  e3_stmt*)p);.  s
8aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
8ab0: 74 65 70 52 65 73 75 6c 74 28 28 56 64 62 65 2a  tepResult((Vdbe*
8ac0: 29 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65  )pNew);.  sqlite
8ad0: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 28 56  3VdbeFinalize((V
8ae0: 64 62 65 2a 29 70 4e 65 77 29 3b 0a 20 20 72 65  dbe*)pNew);.  re
8af0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8b00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 65  }.../*.** Two ve
8b10: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 6f 66  rsions of the of
8b20: 66 69 63 69 61 6c 20 41 50 49 2e 20 20 4c 65 67  ficial API.  Leg
8b30: 61 63 79 20 61 6e 64 20 6e 65 77 20 75 73 65 2e  acy and new use.
8b40: 20 20 49 6e 20 74 68 65 20 6c 65 67 61 63 79 0a    In the legacy.
8b50: 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ** version, the 
8b60: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
8b70: 74 20 69 73 20 6e 6f 74 20 73 61 76 65 64 20 69  t is not saved i
8b80: 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
8b90: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20  tatement.** and 
8ba0: 73 6f 20 69 66 20 61 20 73 63 68 65 6d 61 20 63  so if a schema c
8bb0: 68 61 6e 67 65 20 6f 63 63 75 72 73 2c 20 53 51  hange occurs, SQ
8bc0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 73 20 72  LITE_SCHEMA is r
8bd0: 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 73 71  eturned by.** sq
8be0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 49  lite3_step().  I
8bf0: 6e 20 74 68 65 20 6e 65 77 20 76 65 72 73 69 6f  n the new versio
8c00: 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  n, the original 
8c10: 53 51 4c 20 74 65 78 74 20 69 73 20 72 65 74 61  SQL text is reta
8c20: 69 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ined.** and the 
8c30: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 75 74  statement is aut
8c40: 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65 63 6f 6d  omatically recom
8c50: 70 69 6c 65 64 20 69 66 20 61 6e 20 73 63 68 65  piled if an sche
8c60: 6d 61 20 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63  ma change.** occ
8c70: 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
8c80: 74 65 33 5f 70 72 65 70 61 72 65 28 0a 20 20 73  te3_prepare(.  s
8c90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
8ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8cb0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a  base handle. */.
8cc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
8cd0: 71 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ql,         /* U
8ce0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c  TF-8 encoded SQL
8cf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
8d00: 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20   int nBytes,    
8d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
8d20: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20  ngth of zSql in 
8d30: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  bytes. */.  sqli
8d40: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
8d50: 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20  t,    /* OUT: A 
8d60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
8d70: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8d80: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
8d90: 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20  r **pzTail      
8da0: 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20   /* OUT: End of 
8db0: 70 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f  parsed string */
8dc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
8dd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b  rc = sqlite3Lock
8de0: 41 6e 64 50 72 65 70 61 72 65 28 64 62 2c 7a 53  AndPrepare(db,zS
8df0: 71 6c 2c 6e 42 79 74 65 73 2c 30 2c 30 2c 70 70  ql,nBytes,0,0,pp
8e00: 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20  Stmt,pzTail);.  
8e10: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8e20: 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d  TE_OK || ppStmt=
8e30: 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30  =0 || *ppStmt==0
8e40: 20 29 3b 20 20 2f 2a 20 56 45 52 49 46 59 3a 20   );  /* VERIFY: 
8e50: 46 31 33 30 32 31 20 2a 2f 0a 20 20 72 65 74 75  F13021 */.  retu
8e60: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
8e70: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
8e80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ea0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
8eb0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8ec0: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
8ed0: 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  /* UTF-8 encoded
8ee0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
8ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f10: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
8f20: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
8f30: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
8f40: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
8f50: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
8f60: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
8f70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
8f80: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20   char **pzTail  
8f90: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
8fa0: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
8fb0: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
8fc0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
8fd0: 4f 46 3a 20 52 2d 33 37 39 32 33 2d 31 32 31 37  OF: R-37923-1217
8fe0: 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 72  3 The sqlite3_pr
8ff0: 65 70 61 72 65 5f 76 32 28 29 20 69 6e 74 65 72  epare_v2() inter
9000: 66 61 63 65 20 77 6f 72 6b 73 0a 20 20 2a 2a 20  face works.  ** 
9010: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
9020: 20 61 73 20 73 71 6c 69 74 65 33 5f 70 72 65 70   as sqlite3_prep
9030: 61 72 65 5f 76 33 28 29 20 77 69 74 68 20 61 20  are_v3() with a 
9040: 7a 65 72 6f 20 70 72 65 70 46 6c 61 67 73 0a 20  zero prepFlags. 
9050: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 20   ** parameter.. 
9060: 20 2a 2a 0a 20 20 2a 2a 20 50 72 6f 6f 66 20 69   **.  ** Proof i
9070: 6e 20 74 68 61 74 20 74 68 65 20 35 74 68 20 70  n that the 5th p
9080: 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69  arameter to sqli
9090: 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65 70 61 72  te3LockAndPrepar
90a0: 65 20 69 73 20 30 20 2a 2f 0a 20 20 72 63 20 3d  e is 0 */.  rc =
90b0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50   sqlite3LockAndP
90c0: 72 65 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e  repare(db,zSql,n
90d0: 42 79 74 65 73 2c 53 51 4c 49 54 45 5f 50 52 45  Bytes,SQLITE_PRE
90e0: 50 41 52 45 5f 53 41 56 45 53 51 4c 2c 30 2c 0a  PARE_SAVESQL,0,.
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70 53               ppS
9110: 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61  tmt,pzTail);.  a
9120: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
9130: 45 5f 4f 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d  E_OK || ppStmt==
9140: 30 20 7c 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20  0 || *ppStmt==0 
9150: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9160: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72  }.int sqlite3_pr
9170: 65 70 61 72 65 5f 76 33 28 0a 20 20 73 71 6c 69  epare_v3(.  sqli
9180: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9190: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
91a0: 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20 20 63  e handle. */.  c
91b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
91c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
91d0: 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  8 encoded SQL st
91e0: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
91f0: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
9200: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9210: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
9220: 65 73 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  es. */.  unsigne
9230: 64 20 69 6e 74 20 70 72 65 70 46 6c 61 67 73 2c  d int prepFlags,
9240: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
9250: 72 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  re SQLITE_PREPAR
9260: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  E_* flags */.  s
9270: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
9280: 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt,    /* OUT:
9290: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
92a0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
92b0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
92c0: 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 20  char **pzTail   
92d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 20      /* OUT: End 
92e0: 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e 67  of parsed string
92f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
9300: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
9310: 46 3a 20 52 2d 35 36 38 36 31 2d 34 32 36 37 33  F: R-56861-42673
9320: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
9330: 5f 76 33 28 29 20 64 69 66 66 65 72 73 20 66 72  _v3() differs fr
9340: 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  om.  ** sqlite3_
9350: 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f 6e 6c  prepare_v2() onl
9360: 79 20 69 6e 20 68 61 76 69 6e 67 20 74 68 65 20  y in having the 
9370: 65 78 74 72 61 20 70 72 65 70 46 6c 61 67 73 20  extra prepFlags 
9380: 70 61 72 61 6d 65 74 65 72 2c 0a 20 20 2a 2a 20  parameter,.  ** 
9390: 77 68 69 63 68 20 69 73 20 61 20 62 69 74 20 61  which is a bit a
93a0: 72 72 61 79 20 63 6f 6e 73 69 73 74 69 6e 67 20  rray consisting 
93b0: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
93c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  of the.  ** SQLI
93d0: 54 45 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61  TE_PREPARE_* fla
93e0: 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72  gs..  **.  ** Pr
93f0: 6f 6f 66 20 62 79 20 63 6f 6d 70 61 72 69 73 6f  oof by compariso
9400: 6e 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  n to the impleme
9410: 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
9420: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 0a  e3_prepare_v2().
9430: 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 62    ** directly ab
9440: 6f 76 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ove. */.  rc = s
9450: 71 6c 69 74 65 33 4c 6f 63 6b 41 6e 64 50 72 65  qlite3LockAndPre
9460: 70 61 72 65 28 64 62 2c 7a 53 71 6c 2c 6e 42 79  pare(db,zSql,nBy
9470: 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
9480: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45        SQLITE_PRE
9490: 50 41 52 45 5f 53 41 56 45 53 51 4c 7c 28 70 72  PARE_SAVESQL|(pr
94a0: 65 70 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 50  epFlags&SQLITE_P
94b0: 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c 0a 20 20  REPARE_MASK),.  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
94d0: 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b  ,ppStmt,pzTail);
94e0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
94f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 70 53 74  QLITE_OK || ppSt
9500: 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53 74 6d 74  mt==0 || *ppStmt
9510: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
9520: 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
9530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
9540: 36 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  6./*.** Compile 
9550: 74 68 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  the UTF-16 encod
9560: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
9570: 20 7a 53 71 6c 20 69 6e 74 6f 20 61 20 73 74 61   zSql into a sta
9580: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
9590: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
95a0: 69 74 65 33 50 72 65 70 61 72 65 31 36 28 0a 20  ite3Prepare16(. 
95b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
95c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
95d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
95e0: 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  / .  const void 
95f0: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f  *zSql,         /
9600: 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  * UTF-16 encoded
9610: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
9620: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9640: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
9650: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
9660: 75 33 32 20 70 72 65 70 46 6c 61 67 73 2c 20 20  u32 prepFlags,  
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
9680: 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45  o or more SQLITE
9690: 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73  _PREPARE_* flags
96a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
96b0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
96c0: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
96d0: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
96e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
96f0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a   const void **pz
9700: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
9710: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
9720: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
9730: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
9740: 20 63 75 72 72 65 6e 74 6c 79 20 77 6f 72 6b 73   currently works
9750: 20 62 79 20 66 69 72 73 74 20 74 72 61 6e 73 66   by first transf
9760: 6f 72 6d 69 6e 67 20 74 68 65 20 55 54 46 2d 31  orming the UTF-1
9770: 36 0a 20 20 2a 2a 20 65 6e 63 6f 64 65 64 20 73  6.  ** encoded s
9780: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2c 20  tring to UTF-8, 
9790: 74 68 65 6e 20 69 6e 76 6f 6b 69 6e 67 20 73 71  then invoking sq
97a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e  lite3_prepare().
97b0: 20 54 68 65 0a 20 20 2a 2a 20 74 72 69 63 6b 79   The.  ** tricky
97c0: 20 62 69 74 20 69 73 20 66 69 67 75 72 69 6e 67   bit is figuring
97d0: 20 6f 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   out the pointer
97e0: 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70   to return in *p
97f0: 7a 54 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 63 68  zTail..  */.  ch
9800: 61 72 20 2a 7a 53 71 6c 38 3b 0a 20 20 63 6f 6e  ar *zSql8;.  con
9810: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 38 20  st char *zTail8 
9820: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
9830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64  SQLITE_OK;..#ifd
9840: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9850: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
9860: 20 70 70 53 74 6d 74 3d 3d 30 20 29 20 72 65 74   ppStmt==0 ) ret
9870: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
9880: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
9890: 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
98a0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
98b0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 7c 7c 7a  tyCheckOk(db)||z
98c0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
98d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
98e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
98f0: 66 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 7b 0a  f( nBytes>=0 ){.
9900: 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
9910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
9920: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
9930: 6c 3b 0a 20 20 20 20 66 6f 72 28 73 7a 3d 30 3b  l;.    for(sz=0;
9940: 20 73 7a 3c 6e 42 79 74 65 73 20 26 26 20 28 7a   sz<nBytes && (z
9950: 5b 73 7a 5d 21 3d 30 20 7c 7c 20 7a 5b 73 7a 2b  [sz]!=0 || z[sz+
9960: 31 5d 21 3d 30 29 3b 20 73 7a 20 2b 3d 20 32 29  1]!=0); sz += 2)
9970: 7b 7d 0a 20 20 20 20 6e 42 79 74 65 73 20 3d 20  {}.    nBytes = 
9980: 73 7a 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  sz;.  }.  sqlite
9990: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
99a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7a 53 71 6c  ->mutex);.  zSql
99b0: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
99c0: 74 6f 38 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 42  to8(db, zSql, nB
99d0: 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 55 54 46  ytes, SQLITE_UTF
99e0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28  16NATIVE);.  if(
99f0: 20 7a 53 71 6c 38 20 29 7b 0a 20 20 20 20 72 63   zSql8 ){.    rc
9a00: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 41 6e   = sqlite3LockAn
9a10: 64 50 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  dPrepare(db, zSq
9a20: 6c 38 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67  l8, -1, prepFlag
9a30: 73 2c 20 30 2c 20 70 70 53 74 6d 74 2c 20 26 7a  s, 0, ppStmt, &z
9a40: 54 61 69 6c 38 29 3b 0a 20 20 7d 0a 0a 20 20 69  Tail8);.  }..  i
9a50: 66 28 20 7a 54 61 69 6c 38 20 26 26 20 70 7a 54  f( zTail8 && pzT
9a60: 61 69 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ail ){.    /* If
9a70: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
9a80: 20 72 65 74 75 72 6e 73 20 61 20 74 61 69 6c 20   returns a tail 
9a90: 70 6f 69 6e 74 65 72 2c 20 77 65 20 63 61 6c 63  pointer, we calc
9aa0: 75 6c 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ulate the.    **
9ab0: 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 69 6e   equivalent poin
9ac0: 74 65 72 20 69 6e 74 6f 20 74 68 65 20 55 54 46  ter into the UTF
9ad0: 2d 31 36 20 73 74 72 69 6e 67 20 62 79 20 63 6f  -16 string by co
9ae0: 75 6e 74 69 6e 67 20 74 68 65 20 75 6e 69 63 6f  unting the unico
9af0: 64 65 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63  de.    ** charac
9b00: 74 65 72 73 20 62 65 74 77 65 65 6e 20 7a 53 71  ters between zSq
9b10: 6c 38 20 61 6e 64 20 7a 54 61 69 6c 38 2c 20 61  l8 and zTail8, a
9b20: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 69 6e  nd then returnin
9b30: 67 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  g a pointer.    
9b40: 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ** the same numb
9b50: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
9b60: 20 69 6e 74 6f 20 74 68 65 20 55 54 46 2d 31 36   into the UTF-16
9b70: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a   string..    */.
9b80: 20 20 20 20 69 6e 74 20 63 68 61 72 73 5f 70 61      int chars_pa
9b90: 72 73 65 64 20 3d 20 73 71 6c 69 74 65 33 55 74  rsed = sqlite3Ut
9ba0: 66 38 43 68 61 72 4c 65 6e 28 7a 53 71 6c 38 2c  f8CharLen(zSql8,
9bb0: 20 28 69 6e 74 29 28 7a 54 61 69 6c 38 2d 7a 53   (int)(zTail8-zS
9bc0: 71 6c 38 29 29 3b 0a 20 20 20 20 2a 70 7a 54 61  ql8));.    *pzTa
9bd0: 69 6c 20 3d 20 28 75 38 20 2a 29 7a 53 71 6c 20  il = (u8 *)zSql 
9be0: 2b 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79  + sqlite3Utf16By
9bf0: 74 65 4c 65 6e 28 7a 53 71 6c 2c 20 63 68 61 72  teLen(zSql, char
9c00: 73 5f 70 61 72 73 65 64 29 3b 0a 20 20 7d 0a 20  s_parsed);.  }. 
9c10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9c20: 62 2c 20 7a 53 71 6c 38 29 3b 20 0a 20 20 72 63  b, zSql8); .  rc
9c30: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
9c40: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
9c50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9c60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9c70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9c80: 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
9c90: 6f 66 20 74 68 65 20 6f 66 66 69 63 69 61 6c 20  of the official 
9ca0: 41 50 49 2e 20 20 4c 65 67 61 63 79 20 61 6e 64  API.  Legacy and
9cb0: 20 6e 65 77 20 75 73 65 2e 20 20 49 6e 20 74 68   new use.  In th
9cc0: 65 20 6c 65 67 61 63 79 0a 2a 2a 20 76 65 72 73  e legacy.** vers
9cd0: 69 6f 6e 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ion, the origina
9ce0: 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20 6e 6f  l SQL text is no
9cf0: 74 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 70  t saved in the p
9d00: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9d10: 74 0a 2a 2a 20 61 6e 64 20 73 6f 20 69 66 20 61  t.** and so if a
9d20: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 20 6f   schema change o
9d30: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 53 43  ccurs, SQLITE_SC
9d40: 48 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64  HEMA is returned
9d50: 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73   by.** sqlite3_s
9d60: 74 65 70 28 29 2e 20 20 49 6e 20 74 68 65 20 6e  tep().  In the n
9d70: 65 77 20 76 65 72 73 69 6f 6e 2c 20 74 68 65 20  ew version, the 
9d80: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
9d90: 74 20 69 73 20 72 65 74 61 69 6e 65 64 0a 2a 2a  t is retained.**
9da0: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
9db0: 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  nt is automatica
9dc0: 6c 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 20 69  lly recompiled i
9dd0: 66 20 61 6e 20 73 63 68 65 6d 61 20 63 68 61 6e  f an schema chan
9de0: 67 65 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  ge.** occurs..*/
9df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65  .int sqlite3_pre
9e00: 70 61 72 65 31 36 28 0a 20 20 73 71 6c 69 74 65  pare16(.  sqlite
9e10: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9e20: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9e30: 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63 6f  handle. */ .  co
9e40: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20  nst void *zSql, 
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31          /* UTF-1
9e60: 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73 74  6 encoded SQL st
9e70: 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e  atement. */.  in
9e80: 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20 20  t nBytes,       
9e90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9ea0: 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74  h of zSql in byt
9eb0: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
9ec0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
9ed0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69     /* OUT: A poi
9ee0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
9ef0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
9f00: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
9f10: 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f 2a  *pzTail       /*
9f20: 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61 72   OUT: End of par
9f30: 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  sed string */.){
9f40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
9f50: 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72 65  = sqlite3Prepare
9f60: 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65  16(db,zSql,nByte
9f70: 73 2c 30 2c 70 70 53 74 6d 74 2c 70 7a 54 61 69  s,0,ppStmt,pzTai
9f80: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
9f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
9fa0: 70 53 74 6d 74 3d 3d 30 20 7c 7c 20 2a 70 70 53  pStmt==0 || *ppS
9fb0: 74 6d 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 56 45  tmt==0 );  /* VE
9fc0: 52 49 46 59 3a 20 46 31 33 30 32 31 20 2a 2f 0a  RIFY: F13021 */.
9fd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
9fe0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  nt sqlite3_prepa
9ff0: 72 65 31 36 5f 76 32 28 0a 20 20 73 71 6c 69 74  re16_v2(.  sqlit
a000: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
a010: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a020: 20 68 61 6e 64 6c 65 2e 20 2a 2f 20 0a 20 20 63   handle. */ .  c
a030: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 2c  onst void *zSql,
a040: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46 2d           /* UTF-
a050: 31 36 20 65 6e 63 6f 64 65 64 20 53 51 4c 20 73  16 encoded SQL s
a060: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
a070: 6e 74 20 6e 42 79 74 65 73 2c 20 20 20 20 20 20  nt nBytes,      
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
a090: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
a0a0: 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tes. */.  sqlite
a0b0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
a0c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70 6f      /* OUT: A po
a0d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
a0e0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
a0f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
a100: 2a 2a 70 7a 54 61 69 6c 20 20 20 20 20 20 20 2f  **pzTail       /
a110: 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70 61  * OUT: End of pa
a120: 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rsed string */.)
a130: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
a140: 20 3d 20 73 71 6c 69 74 65 33 50 72 65 70 61 72   = sqlite3Prepar
a150: 65 31 36 28 64 62 2c 7a 53 71 6c 2c 6e 42 79 74  e16(db,zSql,nByt
a160: 65 73 2c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  es,SQLITE_PREPAR
a170: 45 5f 53 41 56 45 53 51 4c 2c 70 70 53 74 6d 74  E_SAVESQL,ppStmt
a180: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
a190: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a1a0: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
a1b0: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
a1c0: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
a1d0: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
a1e0: 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
a1f0: 5f 70 72 65 70 61 72 65 31 36 5f 76 33 28 0a 20  _prepare16_v3(. 
a200: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
a220: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
a230: 2f 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  / .  const void 
a240: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 2f  *zSql,         /
a250: 2a 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  * UTF-16 encoded
a260: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
a270: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 2c  */.  int nBytes,
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a290: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
a2a0: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
a2b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65  unsigned int pre
a2c0: 70 46 6c 61 67 73 2c 20 20 20 2f 2a 20 5a 65 72  pFlags,   /* Zer
a2d0: 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 49 54 45  o or more SQLITE
a2e0: 5f 50 52 45 50 41 52 45 5f 2a 20 66 6c 61 67 73  _PREPARE_* flags
a2f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
a300: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
a310: 2f 2a 20 4f 55 54 3a 20 41 20 70 6f 69 6e 74 65  /* OUT: A pointe
a320: 72 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  r to the prepare
a330: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
a340: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a   const void **pz
a350: 54 61 69 6c 20 20 20 20 20 20 20 2f 2a 20 4f 55  Tail       /* OU
a360: 54 3a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 64  T: End of parsed
a370: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
a380: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
a390: 71 6c 69 74 65 33 50 72 65 70 61 72 65 31 36 28  qlite3Prepare16(
a3a0: 64 62 2c 7a 53 71 6c 2c 6e 42 79 74 65 73 2c 0a  db,zSql,nBytes,.
a3b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
a3c0: 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c 7c  PREPARE_SAVESQL|
a3d0: 28 70 72 65 70 46 6c 61 67 73 26 53 51 4c 49 54  (prepFlags&SQLIT
a3e0: 45 5f 50 52 45 50 41 52 45 5f 4d 41 53 4b 29 2c  E_PREPARE_MASK),
a3f0: 0a 20 20 20 20 20 20 20 20 20 70 70 53 74 6d 74  .         ppStmt
a400: 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65  ,pzTail);.  asse
a410: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a420: 4b 20 7c 7c 20 70 70 53 74 6d 74 3d 3d 30 20 7c  K || ppStmt==0 |
a430: 7c 20 2a 70 70 53 74 6d 74 3d 3d 30 20 29 3b 20  | *ppStmt==0 ); 
a440: 20 2f 2a 20 56 45 52 49 46 59 3a 20 46 31 33 30   /* VERIFY: F130
a450: 32 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  21 */.  return r
a460: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
a470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
a480: 36 20 2a 2f 0a                                   6 */.