/ Hex Artifact Content
Login

Artifact c843ef3d4440b591e154d0e78c664e213236db68:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 32 32 35 20 32 30 30 34 2f 30 36 2f 31 39 20 31  225 2004/06/19 1
0300: 34 3a 34 39 3a 31 32 20 64 72 68 20 45 78 70 20  4:49:12 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73  sqlite3BeginPars
0440: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0450: 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67   int explainFlag
0460: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
0470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0480: 69 6e 74 20 69 3b 0a 20 20 70 50 61 72 73 65 2d  int i;.  pParse-
0490: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04a0: 69 6e 46 6c 61 67 3b 0a 23 69 66 20 30 0a 20 20  inFlag;.#if 0.  
04b0: 69 66 28 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  if((db->flags & 
04c0: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
04d0: 65 64 29 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e  ed)==0 && db->in
04e0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
04f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
0500: 65 33 49 6e 69 74 28 64 62 2c 20 26 70 50 61 72  e3Init(db, &pPar
0510: 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  se->zErrMsg);.  
0520: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0530: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
0540: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
0550: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
0560: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ++;.    }.  }.#e
0570: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
0580: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
0590: 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70  .    DbClearProp
05a0: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 4c  erty(db, i, DB_L
05b0: 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
05c0: 21 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72  !db->aDb[i].inTr
05d0: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 44 62 43  ans ){.      DbC
05e0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
05f0: 20 69 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a   i, DB_Cookie);.
0600: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
0610: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a  se->nVar = 0;.}.
0620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0630: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0640: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0650: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0660: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0670: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0680: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0690: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
06a0: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
06b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
06c0: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
06d0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
06e0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
06f0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0700: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0710: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0720: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
0730: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
0740: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
0750: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
0760: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
0770: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
0780: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0790: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
07a0: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
07b0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
07c0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
07d0: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
07e0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
07f0: 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  n;..  /* Begin b
0800: 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d  y generating som
0810: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  e termination co
0820: 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  de at the end of
0830: 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70   the.  ** vdbe p
0840: 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62  rogram.  */.  db
0850: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0860: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
0870: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
0880: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
0890: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
08a0: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
08b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
08c0: 63 6f 6f 6b 69 65 4d 61 73 6b 21 3d 30 20 29 7b  cookieMask!=0 ){
08d0: 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
08e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  .      int iDb;.
08f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0900: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 70 50 61  eChangeP2(v, pPa
0910: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2c  rse->cookieGoto,
0920: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
0930: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
0940: 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61     for(iDb=0, ma
0950: 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  sk=1; iDb<db->nD
0960: 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62  b; mask<<=1, iDb
0970: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
0980: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
0990: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20  >cookieMask)==0 
09a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
09b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
09c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
09d0: 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61  action, iDb, (ma
09e0: 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69  sk & pParse->wri
09f0: 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20  teMask)!=0);.   
0a00: 20 20 20 20 20 69 66 28 20 69 44 62 21 3d 31 20       if( iDb!=1 
0a10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
0a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a30: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
0a40: 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63  , iDb, pParse->c
0a50: 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29  ookieValue[iDb])
0a60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0a70: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
0a80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0a90: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
0aa0: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2b 31 29 3b  ->cookieGoto+1);
0ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
0ac0: 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72   Get the VDBE pr
0ad0: 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20  ogram ready for 
0ae0: 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20  execution.  */. 
0af0: 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65   if( v && pParse
0b00: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
0b10: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
0b20: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
0b30: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
0b40: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
0b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
0b60: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20  ace(v, trace);. 
0b70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
0b80: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
0b90: 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d  e->nVar, pParse-
0ba0: 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70  >explain);.    p
0bb0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72  Parse->rc = pPar
0bc0: 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54  se->nErr ? SQLIT
0bd0: 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45  E_ERROR : SQLITE
0be0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
0bf0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
0c00: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
0c10: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
0c20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
0c30: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
0c40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
0c50: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
0c60: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
0c70: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
0c80: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
0c90: 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->nAgg = 0;.  pP
0ca0: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
0cb0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
0cc0: 4d 61 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Mask = 0;.}../*.
0cd0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
0ce0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
0cf0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
0d00: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
0d10: 72 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  r database table
0d20: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a   given the name.
0d30: 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
0d40: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
0d50: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
0d60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
0d70: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
0d80: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
0d90: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
0da0: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
0db0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
0dc0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
0dd0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
0de0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
0df0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
0e00: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
0e10: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
0e20: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
0e30: 6c 65 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  le names is done
0e40: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
0e50: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
0e60: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
0e70: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
0e80: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
0e90: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
0ea0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
0eb0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
0ec0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
0ed0: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
0ee0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
0ef0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  e(sqlite *db, co
0f00: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
0f10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
0f20: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
0f30: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
0f40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
0f50: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 64  ite3ReadSchema(d
0f60: 62 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30  b, 0);.  for(i=0
0f70: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
0f80: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
0f90: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
0fa0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
0fb0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
0fc0: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
0fd0: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
0fe0: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
0ff0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
1000: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
1010: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1020: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1030: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1040: 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e  b[j].tblHash, zN
1050: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1060: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1070: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1080: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1090: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
10a0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
10b0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10c0: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
10d0: 72 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  r database table
10e0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a   given the name.
10f0: 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
1100: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1110: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
1120: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
1130: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1140: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1150: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1160: 2a 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 20  * Also leave an 
1170: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
1180: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
1190: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
11a0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
11b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
11c0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
11d0: 28 29 0a 2a 2a 20 69 73 20 74 68 61 74 20 74 68  ().** is that th
11e0: 69 73 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  is routine leave
11f0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
1200: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
1210: 72 72 4d 73 67 0a 2a 2a 20 77 68 65 72 65 20 73  rrMsg.** where s
1220: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1230: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
1240: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
1250: 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ateTable(Parse *
1260: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1270: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
1280: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a   char *zDbase){.
1290: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 70    Table *p;..  p
12a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
12b0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
12c0: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
12d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
12e0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
12f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1300: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1310: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1320: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
1330: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1340: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1350: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1360: 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1380: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1390: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
13a0: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
13b0: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
13c0: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
13d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1400: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1410: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
1420: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1430: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
1440: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1450: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1460: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1470: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1480: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1490: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
14a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
14b0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
14c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
14d0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
14e0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
14f0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1500: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1510: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1520: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1530: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1540: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1550: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1560: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1570: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1580: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
1590: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
15a0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
15b0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
15c0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
15d0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
15e0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
15f0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1600: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
1610: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1620: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
1630: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
1640: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1650: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
1660: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
1670: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
1680: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   i;.  int rc = s
1690: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
16a0: 28 64 62 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  (db, 0);.  for(i
16b0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
16c0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
16d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
16e0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
16f0: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
1700: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
1710: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
1720: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1730: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
1740: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
1750: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
1760: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
1770: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
1780: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1790: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
17a0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
17b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
17c0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
17d0: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
17e0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
17f0: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1800: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1810: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1820: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1830: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
1840: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
1850: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
1860: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
1870: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
1880: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
1890: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
18a0: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
18b0: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
18c0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
18d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18e0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
18f0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1900: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
1910: 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pOld;..  assert(
1920: 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61   db!=0 && p->zNa
1930: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  me!=0 );.  pOld 
1940: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1950: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
1960: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d  iDb].idxHash, p-
1970: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d    strlen(p->zNam
19a0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  e)+1, 0);.  if( 
19b0: 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21  pOld!=0 && pOld!
19c0: 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =p ){.    sqlite
19d0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
19e0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
19f0: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
1a00: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1a10: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1a20: 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  Old->zName)+1, p
1a30: 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Old);.  }.  if( 
1a40: 70 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20  p->zColAff ){.  
1a50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
1a60: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a 20 20  zColAff);.  }.  
1a70: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
1a80: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
1a90: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
1aa0: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
1ab0: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
1ac0: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
1ad0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
1ae0: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
1af0: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
1b00: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
1b10: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
1b20: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20  eteIndex(sqlite 
1b30: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  *db, Index *pInd
1b40: 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65  ex){.  if( pInde
1b50: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1b60: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
1b70: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1b80: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1b90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
1ba0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
1bb0: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
1bc0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1bd0: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
1be0: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
1bf0: 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70  ext){}.    if( p
1c00: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
1c10: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d  ndex ){.      p-
1c20: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
1c30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1c40: 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  }.  sqliteDelete
1c50: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1c60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  );.}../*.** Eras
1c70: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
1c80: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
1c90: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
1ca0: 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61   tables of.** da
1cb0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cc0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
1cd0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
1ce0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
1cf0: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65  before the conne
1d00: 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49  ction closes.  I
1d10: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
1d20: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1d30: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
1d40: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
1d50: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
1d60: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1d70: 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20   If iDb<=0 then 
1d80: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
1d90: 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  al schema tables
1da0: 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
1db0: 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20  e.** files.  If 
1dc0: 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65  iDb>=2 then rese
1dd0: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
1de0: 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74  chema for only t
1df0: 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c  he.** single fil
1e00: 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  e indicated..*/.
1e10: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
1e20: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
1e30: 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20  sqlite *db, int 
1e40: 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iDb){.  HashElem
1e50: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
1e60: 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65  temp1;.  Hash te
1e70: 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  mp2;.  int i, j;
1e80: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
1e90: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
1ea0: 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  b );.  db->flags
1eb0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
1ec0: 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69  ialized;.  for(i
1ed0: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
1ee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
1ef0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
1f00: 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44  ;.    temp1 = pD
1f10: 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  b->tblHash;.    
1f20: 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69  temp2 = pDb->tri
1f30: 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74  gHash;.    sqlit
1f40: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
1f50: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
1f60: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
1f70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
1f80: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46  shClear(&pDb->aF
1f90: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
1fa0: 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  3HashClear(&pDb-
1fb0: 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66  >idxHash);.    f
1fc0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1fd0: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29  ashFirst(&temp2)
1fe0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
1ff0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
2000: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 72 69  lem)){.      Tri
2010: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d  gger *pTrigger =
2020: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
2030: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  pElem);.      sq
2040: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
2050: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
2060: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2070: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
2080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2090: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
20a0: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
20b0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
20c0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
20d0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
20e0: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
20f0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2100: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2110: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
2120: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2130: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
2140: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
2150: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
2160: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2170: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
2180: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
2190: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
21a0: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28  Loaded);.    if(
21b0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
21c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
21d0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
21e0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
21f0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
2200: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
2210: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
2220: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2230: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
2240: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
2250: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
2260: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2270: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
2280: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
2290: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
22a0: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
22b0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
22c0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
22d0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
22e0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
22f0: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
2300: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
2310: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
2320: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
2330: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2340: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
2350: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2360: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2370: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
2380: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
2390: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75      if( pDb->pAu
23a0: 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41  x && pDb->xFreeA
23b0: 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41  ux ) pDb->xFreeA
23c0: 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20  ux(pDb->pAux);. 
23d0: 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d       pDb->pAux =
23e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
23f0: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
2400: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2410: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
2420: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2430: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
2440: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2450: 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65  eFree(pDb->zName
2460: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
2470: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
2480: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2490: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
24a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
24b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
24c0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
24d0: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
24e0: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
24f0: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
2500: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
2510: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
2520: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
2530: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
2540: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
2550: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
2560: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
2570: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
2580: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2590: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
25a0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
25b0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
25c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25d0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
25e0: 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ver a rollback o
25f0: 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72 65  ccurs.  If there
2600: 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20   were.** schema 
2610: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2620: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
2630: 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20  then we have to 
2640: 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74  reset the.** int
2650: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
2660: 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65  s and reload the
2670: 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a  m from disk..*/.
2680: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
2690: 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e  backInternalChan
26a0: 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  ges(sqlite *db){
26b0: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
26c0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
26d0: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73  Changes ){.    s
26e0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
26f0: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
2700: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2710: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2720: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
2730: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
2740: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
2750: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
2760: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
2770: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2780: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2790: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  es;.}../*.** Rem
27a0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
27b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
27c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
27d0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
27e0: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
27f0: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
2800: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
2810: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2820: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
2830: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
2840: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
2850: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
2860: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
2870: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
2880: 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64  sh table.  Nor d
2890: 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a  oes it remove.**
28a0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72   foreign keys fr
28b0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46  om the sqlite.aF
28c0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Key hash table. 
28d0: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
28e0: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
28f0: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
2900: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
2910: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
2920: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
2930: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2940: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
2950: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
2960: 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72   are unlinked fr
2970: 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64  om the "db".** d
2980: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66  ata structure if
2990: 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64   db!=NULL.  If d
29a0: 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73  b==NULL, indices
29b0: 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20   attached to.** 
29c0: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65  the table are de
29d0: 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73  leted, but it is
29e0: 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61   assumed they ha
29f0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
2a00: 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a  ** unlinked..*/.
2a10: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
2a20: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  teTable(sqlite *
2a30: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
2a40: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49  e){.  int i;.  I
2a50: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
2a60: 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46  Next;.  FKey *pF
2a70: 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b  Key, *pNextFKey;
2a80: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
2a90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
2aa0: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
2ab0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
2ac0: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
2ad0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
2ae0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
2af0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
2b00: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
2b10: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
2b20: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
2b30: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70  ( pIndex->iDb==p
2b40: 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70  Table->iDb || (p
2b50: 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26  Table->iDb==0 &&
2b60: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29   pIndex->iDb==1)
2b70: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   );.    sqliteDe
2b80: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
2b90: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
2ba0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65   Delete all fore
2bb0: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
2bc0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
2bd0: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20  ble.  The keys. 
2be0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
2bf0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c  already been unl
2c00: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64  inked from the d
2c10: 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  b->aFKey hash ta
2c20: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
2c30: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
2c40: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
2c50: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
2c60: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
2c70: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
2c80: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2c90: 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20  le->iDb<db->nDb 
2ca0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
2cb0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2cc0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
2cd0: 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20  iDb].aFKey,.    
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
2d00: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
2d10: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
2d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2d30: 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20  e(pFKey);.  }.. 
2d40: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
2d50: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
2d60: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tself..  */.  fo
2d70: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
2d80: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2d90: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2da0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
2db0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
2dc0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2dd0: 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  i].zDflt);.    s
2de0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2df0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
2e00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
2e10: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
2e20: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2e30: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
2e40: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 7a 43 6f   if( pTable->zCo
2e50: 6c 41 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  lAff ){.    sqli
2e60: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2e70: 43 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a 20 20 73  ColAff);.  }.  s
2e80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2e90: 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  te(pTable->pSele
2ea0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ct);.  sqliteFre
2eb0: 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a  e(pTable);.}../*
2ec0: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
2ed0: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
2ee0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
2ef0: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
2f00: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
2f10: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
2f20: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
2f30: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
2f40: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2f50: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
2f60: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64  eTable(sqlite *d
2f70: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
2f80: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 46  Table *pOld;.  F
2f90: 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a  Key *pF1, *pF2;.
2fa0: 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69 44 62    int i = p->iDb
2fb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
2fc0: 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71  0 );.  pOld = sq
2fd0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2fe0: 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48  &db->aDb[i].tblH
2ff0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
3000: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
3010: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
3020: 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64   pOld==0 || pOld
3030: 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46 31  ==p );.  for(pF1
3040: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20  =p->pFKey; pF1; 
3050: 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72  pF1=pF1->pNextFr
3060: 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  om){.    int nTo
3070: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
3080: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46 32  To) + 1;.    pF2
3090: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
30a0: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61  nd(&db->aDb[i].a
30b0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
30c0: 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 46  nTo);.    if( pF
30d0: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
30e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
30f0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46  t(&db->aDb[i].aF
3100: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3110: 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  To, pF1->pNextTo
3120: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3130: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
3140: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
3150: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
3160: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
3170: 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20   if( pF2 ){.    
3180: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3190: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
31a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65   }.  sqlite3Dele
31c0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
31d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
31e0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
31f0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
3200: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
3210: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
3220: 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74  en with any quot
3230: 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20  ations removed. 
3240: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
3250: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
3260: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
3270: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3280: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
3290: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
32a0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
32b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  on..**.** Tokens
32c0: 20 61 72 65 20 72 65 61 6c 6c 79 20 6a 75 73 74   are really just
32d0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
32e0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
32f0: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
3300: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
3310: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
3320: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
3330: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
3340: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
3350: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
3360: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
3370: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
3380: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
3390: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
33a0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
33b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
33c0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
33d0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
33e0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
33f0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3400: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3410: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
3420: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
3430: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
3440: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
3450: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
3460: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
3470: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
3480: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
3490: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
34a0: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
34b0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
34c0: 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  able(Vdbe *v, in
34d0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
34e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
34f0: 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
3500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
3520: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
3530: 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65  _ROOT);.  sqlite
3540: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3550: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
3560: 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65  0, 5); /* sqlite
3570: 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63 6f  _master has 5 co
3580: 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  lumns */.}../*.*
3590: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
35a0: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
35b0: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
35c0: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
35d0: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
35e0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
35f0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
3600: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3610: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
3620: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
3630: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
3640: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
3650: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
3660: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
3670: 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73 71 6c  /.int findDb(sql
3680: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
3690: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
36a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
36b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
36c0: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e 3d 3d    if( pName->n==
36d0: 73 74 72 6c 65 6e 28 64 62 2d 3e 61 44 62 5b 69  strlen(db->aDb[i
36e0: 5d 2e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ].zName) && .   
36f0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
3700: 74 72 4e 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  trNICmp(db->aDb[
3710: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  i].zName, pName-
3720: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29 7b  >z, pName->n) ){
3730: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b  .      return i;
3740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3750: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69 6e 74 20 73  urn -1;.}..int s
3760: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
3770: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3780: 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  se, .  Token *pN
3790: 61 6d 65 31 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  ame1, .  Token *
37a0: 70 4e 61 6d 65 32 2c 20 0a 20 20 54 6f 6b 65 6e  pName2, .  Token
37b0: 20 2a 2a 70 55 6e 71 75 61 6c 0a 29 7b 0a 20 20   **pUnqual.){.  
37c0: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
37d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
37e0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
37f0: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
3800: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
3810: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
3820: 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  );.    *pUnqual 
3830: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
3840: 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c 20 70  b = findDb(db, p
3850: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
3860: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
3870: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3880: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
3890: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
38a0: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61  ame1);.      pPa
38b0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
38c0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
38d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
38e0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
38f0: 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  t.iDb==0 || db->
3900: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
3910: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
3920: 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  iDb;.    *pUnqua
3930: 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a  l = pName1;.  }.
3940: 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a    return iDb;.}.
3950: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3960: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
3970: 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d  heck if the UTF-
3980: 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69  8 string zName i
3990: 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71  s a legal.** unq
39a0: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f  ualified name fo
39b0: 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f  r a new schema o
39c0: 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e  bject (table, in
39d0: 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20  dex, view or.** 
39e0: 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61  trigger). All na
39f0: 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78  mes are legal ex
3a00: 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20  cept those that 
3a10: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73  begin with the s
3a20: 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65  tring.** "sqlite
3a30: 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f  _" (in upper, lo
3a40: 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73  wer or mixed cas
3a50: 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e  e). This portion
3a60: 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63   of the namespac
3a70: 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64  e.** is reserved
3a80: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
3a90: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
3aa0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
3ab0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3ad0: 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73  e){.  if( !pPars
3ae0: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
3af0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
3b00: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
3b10: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
3b20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3b30: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
3b40: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
3b50: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
3b60: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
3b70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3b80: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
3b90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
3bb0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
3bc0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
3bd0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
3be0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
3bf0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
3c00: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
3c10: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
3c20: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
3c30: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
3c40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3c50: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
3c60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
3c70: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
3c80: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
3c90: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
3ca0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
3cb0: 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70   name.  The.** p
3cc0: 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74  Start token is t
3cd0: 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e  he CREATE and pN
3ce0: 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65  ame is the table
3cf0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65   name.  The isTe
3d00: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
3d10: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
3d20: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
3d30: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
3d40: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
3d50: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
3d60: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
3d70: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
3d80: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
3d90: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
3da0: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
3db0: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
3dc0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
3dd0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
3de0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
3df0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
3e00: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
3e10: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
3e20: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
3e30: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
3e40: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3e50: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
3e60: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
3e70: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
3e80: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
3e90: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
3ea0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
3eb0: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
3ec0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
3ed0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
3ee0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
3ef0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
3f00: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
3f10: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
3f20: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
3f30: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
3f40: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
3f50: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
3f60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3f70: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3f80: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
3f90: 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65  pStart,   /* The
3fa0: 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20   "CREATE" token 
3fb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
3fc0: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
3fd0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
3fe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
3ff0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
4000: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
4010: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65  cond part of the
4020: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4030: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
4040: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
4050: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
4060: 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65   is a TEMP table
4070: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
4080: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4090: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57  f this is a VIEW
40a0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
40b0: 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20  pTable;.  Index 
40c0: 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a  *pIdx;.  char *z
40d0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a  Name;.  sqlite *
40e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
40f0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
4100: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
4110: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4120: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
4130: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
4140: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
4150: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
4160: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4170: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
4180: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4190: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
41a0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
41b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
41c0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
41d0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
41e0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
41f0: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
4200: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
4210: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
4220: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
4230: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
4240: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
4250: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4260: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4270: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
4280: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
4290: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
42a0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
42b0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
42c0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
42d0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
42e0: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
42f0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4300: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4310: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
4320: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
4330: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
4340: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
4350: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
4360: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
4370: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4380: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4390: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
43a0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
43b0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
43c0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
43d0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
43e0: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
43f0: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
4400: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
4410: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
4420: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
4430: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
4440: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
4450: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
4460: 28 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  ( isTemp && iDb>
4470: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
4480: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
4490: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
44a0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
44b0: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
44c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
44d0: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
44e0: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
44f0: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
4500: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4510: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
4520: 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70    }.  if( isTemp
4530: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
4540: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
4550: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
4560: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
4570: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
4580: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
4590: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
45a0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
45b0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
45c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
45d0: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
45e0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
45f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
4600: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
4610: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
4620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4630: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
4640: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
4650: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
4660: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
4670: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
4680: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
4690: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
46a0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
46b0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
46c0: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
46d0: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
46e0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
46f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4700: 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
4710: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
4720: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
4730: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
4740: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
4750: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
4760: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
4770: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
4780: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
4790: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
47a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
47b0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
47c0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
47d0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
47e0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
47f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
4800: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
4810: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
4820: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
4830: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
4840: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
4850: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
4860: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4870: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
4880: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4890: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
48a0: 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72  ore trying to cr
48b0: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
48c0: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72   table, make sur
48d0: 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a  e the Btree for.
48e0: 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d    ** holding tem
48f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73  porary tables is
4900: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   open..  */.  if
4910: 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e  ( isTemp && db->
4920: 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
4930: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
4940: 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  n ){.    int rc 
4950: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
4960: 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
4970: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
4980: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
4990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
49a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
49b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
49c0: 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
49d0: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
49e0: 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
49f0: 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
4a00: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
4a10: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
4a20: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4a30: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4a40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
4a50: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
4a60: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
4a70: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
4a80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
4a90: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
4aa0: 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
4ab0: 70 42 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  pBt, 1, 0);.    
4ac0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4ad0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
4ae0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4af0: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
4b00: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
4b10: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
4b20: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
4b30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
4b40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4b50: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
4b60: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4b70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
4b80: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
4b90: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
4ba0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
4bb0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
4bc0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
4bd0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
4be0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
4bf0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
4c00: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
4c10: 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f  ** it does..  */
4c20: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
4c30: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
4c40: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
4c50: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69  iDb].zName);.  i
4c60: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
4c70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4c80: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
4c90: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
4ca0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
4cb0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
4cc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
4cd0: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
4ce0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
4cf0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
4d00: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
4d10: 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c   (pIdx->iDb==0 |
4d20: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
4d30: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4d40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4d50: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
4d60: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
4d70: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
4d80: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4d90: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4da0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
4db0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
4dc0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
4dd0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
4de0: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
4df0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4e00: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
4e10: 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  rr++;.    sqlite
4e20: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
4e30: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
4e40: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
4e50: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
4e60: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
4e70: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
4e80: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
4e90: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
4ea0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
4eb0: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
4ec0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
4ed0: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33  wTable ) sqlite3
4ee0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
4ef0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4f00: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
4f10: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
4f20: 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
4f30: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
4f40: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
4f50: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
4f60: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
4f70: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
4f80: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
4f90: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
4fa0: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
4fb0: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
4fc0: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
4fd0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
4fe0: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
4ff0: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
5000: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
5010: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
5020: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
5030: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
5040: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
5050: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
5060: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
5070: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
5080: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
5090: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
50a0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
50b0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
50c0: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
50d0: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
50e0: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
50f0: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
5100: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
5110: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
5120: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5130: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5140: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
5150: 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61   /* Every time a
5160: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63 72   new table is cr
5170: 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66  eated the file-f
5180: 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64  ormat.    ** and
5190: 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76   encoding meta-v
51a0: 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69 6e  alues are set in
51b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
51c0: 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68  n.    ** case th
51d0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
51e0: 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a 20  table created.. 
51f0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5200: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5210: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69  _Integer, db->fi
5220: 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  le_format, 0);. 
5230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5240: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
5250: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
5260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5270: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5280: 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20  , db->enc, 0);. 
5290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
52a0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
52b0: 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20  kie, iDb, 4);.. 
52c0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
52d0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62  sterTable(v, iDb
52e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
52f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
5300: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
5310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5320: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
5330: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5340: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5350: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
5360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5370: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
5380: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
5390: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
53a0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
53b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
53c0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
53d0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
53e0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
53f0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
5400: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
5410: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
5420: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5430: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
5440: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
5450: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
5460: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
5470: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
5480: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5490: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
54a0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
54b0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
54c0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
54d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
54e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
54f0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
5500: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
5510: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5520: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5530: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
5540: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5550: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
5560: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
5570: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
5580: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
5590: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
55a0: 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43  StrICmp(z, p->aC
55b0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[i].zName)==0 
55c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
55d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
55e0: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
55f0: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
5600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
5610: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
5620: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
5630: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
5640: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
5650: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
5660: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
5670: 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20  alloc( p->aCol, 
5680: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
5690: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
56a0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
56b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
56c0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
56d0: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
56e0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
56f0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
5700: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
5710: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
5720: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
5730: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
5740: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
5750: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
5760: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
5770: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
5780: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
5790: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
57a0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
57b0: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
57c0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
57d0: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
57e0: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
57f0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
5800: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
5810: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
5820: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
5830: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
5840: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
5850: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5860: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
5870: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
5880: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
5890: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
58a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
58b0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
58c0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
58d0: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
58e0: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
58f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5900: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
5910: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
5920: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
5930: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5940: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5950: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
5960: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5970: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
5980: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5990: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
59a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
59b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
59c0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
59d0: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
59e0: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
59f0: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
5a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5a10: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
5a20: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
5a30: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
5a40: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
5a50: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5a60: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
5a70: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
5a80: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
5a90: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
5aa0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
5ab0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
5ac0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
5ad0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
5ae0: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
5af0: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
5b00: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
5b10: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
5b20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
5b30: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
5b40: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
5b50: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
5b60: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
5b70: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
5b80: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
5b90: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
5ba0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
5bb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
5bc0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
5bd0: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
5be0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
5bf0: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
5c00: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
5c10: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
5c20: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
5c30: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
5c40: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
5c50: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
5c60: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
5c70: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
5c80: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
5c90: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
5ca0: 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  Last->n + Addr(p
5cb0: 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28  Last->z) - Addr(
5cc0: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71  pFirst->z);.  sq
5cd0: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
5ce0: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
5cf0: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
5d00: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
5d10: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
5d20: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
5d30: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
5d40: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
5d50: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
5d60: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
5d70: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
5d80: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
5d90: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
5da0: 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a  tyType(z, n);.}.
5db0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e  ./*.** The given
5dc0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65   token is the de
5dd0: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
5de0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
5df0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
5e00: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
5e10: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5e20: 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c  on.  If "minusFl
5e30: 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a  ag" is true, it.
5e40: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c  ** means the val
5e50: 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65  ue token was pre
5e60: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
5e70: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   sign..**.** Thi
5e80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5e90: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
5ea0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
5eb0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
5ec0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
5ed0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
5ee0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
5ef0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
5f00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
5f10: 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e  n *pVal, int min
5f20: 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65  usFlag){.  Table
5f30: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
5f40: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
5f50: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5f60: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5f70: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5f80: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
5f90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
5fa0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
5fb0: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
5fc0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
5fd0: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
5fe0: 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e  , "-", 1, pVal->
5ff0: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
6000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6010: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
6020: 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  z, pVal->z, pVal
6030: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ->n, 0);.  }.  s
6040: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70  qlite3Dequote(*p
6050: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
6060: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
6070: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
6080: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
6090: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
60a0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
60b0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
60c0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
60d0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
60e0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
60f0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
6100: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
6110: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
6120: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
6130: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
6140: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
6150: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
6160: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
6170: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
6180: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
6190: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
61a0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
61b0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
61c0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
61d0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
61e0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
61f0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
6200: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
6210: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
6220: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
6230: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
6240: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
6250: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
6260: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
6270: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
6280: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
6290: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
62a0: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
62b0: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
62c0: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
62d0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
62e0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
62f0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6300: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
6310: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
6320: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6330: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
6340: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
6350: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
6360: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
6370: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
6380: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
6390: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
63a0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
63b0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
63c0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
63d0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
63e0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
63f0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6400: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
6410: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
6420: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6430: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
6440: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
6450: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
6460: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6470: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
6480: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
6490: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
64a0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
64b0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
64c0: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
64d0: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
64e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
64f0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
6500: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
6510: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
6520: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
6530: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
6540: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
6550: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
6560: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
6570: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
6580: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
6590: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
65a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
65b0: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
65c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
65d0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
65e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
65f0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
6600: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
6610: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
6620: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6630: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
6640: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
6650: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
6660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
6670: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6690: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
66a0: 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l ) pTab->aCol[i
66b0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
66c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
66d0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
66e0: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
66f0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
6700: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
6710: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
6720: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
6730: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
6740: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
6750: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
6760: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
6770: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
6780: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
6790: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
67a0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65  onError;.  }else
67b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
67c0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
67d0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
67e0: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
67f0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
6800: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
6810: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
6820: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
6830: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
6840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6850: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
6860: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
6870: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
6880: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
6890: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
68a0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
68b0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
68c0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
68d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
68e0: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
68f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
6900: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
6910: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6920: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
6930: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
6940: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
6950: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
6960: 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  ol-1;..  pColl =
6970: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
6980: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
6990: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70  ype, nType);.  p
69a0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
69b0: 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49  = pColl;..  /* I
69c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
69d0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
69e0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
69f0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
6a00: 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e  .  ** then an in
6a10: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
6a20: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
6a30: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
6a40: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  the.  ** collati
6a50: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
6a60: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
6a70: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
6a80: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  e..  */.  for(pI
6a90: 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20  dx = p->pIndex; 
6aa0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
6ab0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73  >pNext){.    ass
6ac0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
6ad0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  mn==1 );.    if(
6ae0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6af0: 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65  0]==i ) pIdx->ke
6b00: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
6b10: 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pColl;.  }.}../
6b20: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20  *.** Locate and 
6b30: 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20  return an entry 
6b40: 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c  from the db.aCol
6b50: 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e  lSeq hash table.
6b60: 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a   If the entry.**
6b70: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e   specified by zN
6b80: 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73  ame and nName is
6b90: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70   not found and p
6ba0: 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65  arameter 'create
6bb0: 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  ' is.** true, th
6bc0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
6bd0: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
6be0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
6bf0: 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72  .** Each pointer
6c00: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
6c10: 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20  qlite3.aCollSeq 
6c20: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
6c30: 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20  ins an.** array 
6c40: 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71  of three CollSeq
6c50: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
6c60: 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f   first is the co
6c70: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
6c80: 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66  .** prefferred f
6c90: 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65  or UTF-8, the se
6ca0: 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61  cond UTF-16le, a
6cb0: 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46  nd the third UTF
6cc0: 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f  -16be..**.** Sto
6cd0: 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  red immediately 
6ce0: 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20  after the three 
6cf0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6d00: 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ces is a copy of
6d10: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  .** the collatio
6d20: 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e  n sequence name.
6d30: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
6d40: 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f  is string is sto
6d50: 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63  red in.** each c
6d60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6d70: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
6d80: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
6d90: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
6da0: 79 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  y(.  sqlite *db,
6db0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6dc0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
6dd0: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
6de0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
6df0: 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  oll;.  if( nName
6e00: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
6e10: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43  len(zName);.  pC
6e20: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
6e30: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
6e40: 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
6e50: 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43  e);..  if( 0==pC
6e60: 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b  oll && create ){
6e70: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
6e80: 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a  iteMalloc( 3*siz
6e90: 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e  eof(*pColl) + nN
6ea0: 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ame + 1 );.    i
6eb0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
6ec0: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65    pColl[0].zName
6ed0: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
6ee0: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
6ef0: 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [0].enc = SQLITE
6f00: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f  _UTF8;.      pCo
6f10: 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[1].zName = (c
6f20: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
6f30: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65        pColl[1].e
6f40: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
6f50: 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6LE;.      pColl
6f60: 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [2].zName = (cha
6f70: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
6f80: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63      pColl[2].enc
6f90: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
6fa0: 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  E;.      memcpy(
6fb0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  pColl[0].zName, 
6fc0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
6fd0: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e       pColl[0].zN
6fe0: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
6ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
7000: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f  hInsert(&db->aCo
7010: 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e  llSeq, pColl[0].
7020: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43  zName, nName, pC
7030: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
7040: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
7050: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
7060: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
7070: 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64  to a UTF-8 encod
7080: 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20  ed string nName 
7090: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52  bytes long..** R
70a0: 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65  eturn the CollSe
70b0: 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74  q* pointer for t
70c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
70d0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d  uence named zNam
70e0: 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63  e.** for the enc
70f0: 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d  oding 'enc' from
7100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27 64   the database 'd
7110: 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  b'..**.** If the
7120: 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65 64   entry specified
7130: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e   is not found an
7140: 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74 72  d 'create' is tr
7150: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
7160: 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20  a.** new entry. 
7170: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
7180: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53  n NULL..*/.CollS
7190: 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 43  eq *sqlite3FindC
71a0: 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74 65  ollSeq(.  sqlite
71b0: 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a   *db,.  u8 enc,.
71c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
71d0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  ame,.  int nName
71e0: 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29  ,.  int create.)
71f0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
7200: 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71  ll = findCollSeq
7210: 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c  Entry(db, zName,
7220: 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b   nName, create);
7230: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 73  .  if( pColl ) s
7240: 77 69 74 63 68 28 20 65 6e 63 20 29 7b 0a 20 20  witch( enc ){.  
7250: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
7260: 46 38 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  F8:.      break;
7270: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7280: 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20  _UTF16LE:.      
7290: 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 31  pColl = &pColl[1
72a0: 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ];.      break;.
72b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
72c0: 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 70  UTF16BE:.      p
72d0: 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 32 5d  Coll = &pColl[2]
72e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
72f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20     default: .   
7300: 20 20 20 61 73 73 65 72 74 28 21 22 43 61 6e 6e     assert(!"Cann
7310: 6f 74 20 68 61 70 70 65 6e 22 29 3b 0a 20 20 7d  ot happen");.  }
7320: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
7330: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7340: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73  callCollNeeded(s
7350: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
7360: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
7370: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 4e  t nName){.  /* N
7380: 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  o collation sequ
7390: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70  ence of this typ
73a0: 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64  e for this encod
73b0: 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65  ing is registere
73c0: 64 2e 0a 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65  d..  ** Call the
73d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
73e0: 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ry to see if it 
73f0: 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69  can supply us wi
7400: 74 68 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 63  th one..  */.  c
7410: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65  har const *zExte
7420: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65  rnal = 0;.  asse
7430: 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65  rt( !db->xCollNe
7440: 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f  eded || !db->xCo
7450: 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a 20 20  llNeeded16 );.  
7460: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e  if( nName<0 ) nN
7470: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
7480: 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78  me);.  if( db->x
7490: 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20  CollNeeded ){.  
74a0: 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71    zExternal = sq
74b0: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d  liteStrNDup(zNam
74c0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
74d0: 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20  f( !zExternal ) 
74e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 64 62  return;.      db
74f0: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62  ->xCollNeeded(db
7500: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
7510: 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65  , db, (int)db->e
7520: 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  nc, zExternal);.
7530: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 78 43    }.  if( db->xC
7540: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b 0a 20  ollNeeded16 ){. 
7550: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
7560: 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
7570: 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75  GetTransientValu
7580: 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(db);.    sqlit
7590: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 54  e3ValueSetStr(pT
75a0: 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53  mp, -1, zName, S
75b0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
75c0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
75d0: 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69  zExternal = sqli
75e0: 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54 6d  te3ValueText(pTm
75f0: 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  p, SQLITE_UTF16N
7600: 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  ATIVE);.    if( 
7610: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
7620: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
7630: 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70  llNeeded16(db->p
7640: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64  CollNeededArg, d
7650: 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c  b, (int)db->enc,
7660: 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d   zExternal);.  }
7670: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
7680: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73  ynthCollSeq(Pars
7690: 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53  e *pParse, CollS
76a0: 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 2f 2a  eq *pColl){.  /*
76b0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   The collation f
76c0: 61 63 74 6f 72 79 20 66 61 69 6c 65 64 20 74 6f  actory failed to
76d0: 20 64 65 6c 69 76 65 72 20 61 20 66 75 6e 63 74   deliver a funct
76e0: 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 6d 61  ion but there ma
76f0: 79 20 62 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20  y be.  ** other 
7700: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7710: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
7720: 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74  ion (for other t
7730: 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 20  ext encodings). 
7740: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 20 55   ** available. U
7750: 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  se one of these 
7760: 69 6e 73 74 65 61 64 2e 20 41 76 6f 69 64 20 61  instead. Avoid a
7770: 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31   UTF-8 <-> UTF-1
7780: 36 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  6.  ** conversio
7790: 6e 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 20  n if possible.. 
77a0: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
77b0: 43 6f 6c 6c 32 20 3d 20 30 3b 0a 20 20 63 68 61  Coll2 = 0;.  cha
77c0: 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e  r *z = pColl->zN
77d0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  ame;.  int n = s
77e0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 77 69 74  trlen(z);.  swit
77f0: 63 68 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ch( pParse->db->
7800: 65 6e 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20  enc ){.    case 
7810: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a  SQLITE_UTF16LE:.
7820: 20 20 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73        pColl2 = s
7830: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
7840: 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  q(pParse->db, SQ
7850: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 7a 2c  LITE_UTF16BE, z,
7860: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   n, 0);.      as
7870: 73 65 72 74 28 20 70 43 6f 6c 6c 32 20 29 3b 0a  sert( pColl2 );.
7880: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32        if( pColl2
7890: 2d 3e 78 43 6d 70 20 29 20 62 72 65 61 6b 3b 0a  ->xCmp ) break;.
78a0: 20 20 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73        pColl2 = s
78b0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
78c0: 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  q(pParse->db, SQ
78d0: 4c 49 54 45 5f 55 54 46 38 2c 20 7a 2c 20 6e 2c  LITE_UTF8, z, n,
78e0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
78f0: 74 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20  t( pColl2 );.   
7900: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
7910: 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
7920: 42 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c 32  BE:.      pColl2
7930: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
7940: 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62  llSeq(pParse->db
7950: 2c 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c  ,SQLITE_UTF16LE,
7960: 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20   z, n, 0);.     
7970: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 32 20   assert( pColl2 
7980: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
7990: 6c 6c 32 2d 3e 78 43 6d 70 20 29 20 62 72 65 61  ll2->xCmp ) brea
79a0: 6b 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 32 20  k;.      pColl2 
79b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
79c0: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
79d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 7a 2c 20  SQLITE_UTF8, z, 
79e0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  n, 0);.      ass
79f0: 65 72 74 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20  ert( pColl2 );. 
7a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
7a10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
7a20: 38 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c 32 20  8:.      pColl2 
7a30: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
7a40: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
7a50: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
7a60: 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  z, n, 0);.      
7a70: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 32 20 29  assert( pColl2 )
7a80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  ;.      if( pCol
7a90: 6c 32 2d 3e 78 43 6d 70 20 29 20 62 72 65 61 6b  l2->xCmp ) break
7aa0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 32 20 3d  ;.      pColl2 =
7ab0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
7ac0: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 53  Seq(pParse->db,S
7ad0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 7a  QLITE_UTF16LE, z
7ae0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , n, 0);.      a
7af0: 73 73 65 72 74 28 20 70 43 6f 6c 6c 32 20 29 3b  ssert( pColl2 );
7b00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b10: 7d 0a 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e  }.  if( pColl2->
7b20: 78 43 6d 70 20 29 7b 0a 20 20 20 20 6d 65 6d 63  xCmp ){.    memc
7b30: 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32  py(pColl, pColl2
7b40: 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  , sizeof(CollSeq
7b50: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
7b60: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
7b70: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  r==0 ){.      sq
7b80: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
7b90: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7ba0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
7bb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 22  tion sequence: "
7bc0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2d 31 2c  , .          -1,
7bd0: 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 7d   z, n, 0);.    }
7be0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7bf0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
7c00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7c10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7c20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
7c30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7c40: 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61  alled on a colla
7c50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65  tion sequence be
7c60: 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 20  fore it is used 
7c70: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74  to.** check that
7c80: 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20   it is defined. 
7c90: 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  An undefined col
7ca0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7cb0: 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61  exists when.** a
7cc0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61   database is loa
7cd0: 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ded that contain
7ce0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
7cf0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7d00: 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ces.** that have
7d10: 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65   not been define
7d20: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65  d by sqlite3_cre
7d30: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20  ate_collation() 
7d40: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  etc..**.** If re
7d50: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
7d60: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27  tine calls the '
7d70: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
7d80: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a  ' callback to.**
7d90: 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69 6e   request a defin
7da0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ition of the col
7db0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
7dc0: 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74   If this doesn't
7dd0: 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71   work, .** an eq
7de0: 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69  uivalent collati
7df0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  ng sequence that
7e00: 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e 63   uses a text enc
7e10: 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  oding different.
7e20: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ** from the main
7e30: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75 62   database is sub
7e40: 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65  stituted, if one
7e50: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
7e60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
7e70: 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ckCollSeq(Parse 
7e80: 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
7e90: 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *pColl){.  if( 
7ea0: 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d  pColl && !pColl-
7eb0: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 63 61 6c  >xCmp ){.    cal
7ec0: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72  lCollNeeded(pPar
7ed0: 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  se->db, pColl->z
7ee0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f  Name, strlen(pCo
7ef0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
7f00: 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d   if( !pColl->xCm
7f10: 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65  p && synthCollSe
7f20: 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29  q(pParse, pColl)
7f30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7f40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
7f50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7f60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7f70: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
7f80: 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72  IndexCollSeq(Par
7f90: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
7fa0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20  x *pIdx){.  if( 
7fb0: 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  pIdx ){.    int 
7fc0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
7fd0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
7fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
7ff0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
8000: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64  lSeq(pParse, pId
8010: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
8020: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
8030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8040: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
8050: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8060: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8070: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8080: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
8090: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
80a0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
80b0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
80c0: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
80d0: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
80e0: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
80f0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
8100: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
8110: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
8120: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
8130: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
8140: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
8150: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
8160: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
8170: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
8180: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
8190: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
81a0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
81b0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
81c0: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
81d0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
81e0: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
81f0: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
8200: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
8210: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
8220: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
8230: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
8240: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
8250: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
8260: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
8270: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
8280: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
8290: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
82a0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
82b0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
82c0: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
82d0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
82e0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
82f0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
8300: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
8310: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
8320: 0a 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72  .  u8 enc = pPar
8330: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75  se->db->enc;.  u
8340: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 70 50 61  8 initbusy = pPa
8350: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
8360: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
8370: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
8380: 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ndCollSeq(pParse
8390: 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  ->db, enc, zName
83a0: 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , nName, initbus
83b0: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
83c0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
83d0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
83e0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c  ){.    /* No col
83f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8400: 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72  of this type for
8410: 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   this encoding i
8420: 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20  s registered..  
8430: 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f    ** Call the co
8440: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
8450: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
8460: 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20   supply us with 
8470: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
8480: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70  callCollNeeded(p
8490: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
84a0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43  , nName);.    pC
84b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
84c0: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
84d0: 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  >db, enc, zName,
84e0: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   nName, 0);.    
84f0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43  if( pColl && !pC
8500: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
8510: 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61 79 20     /* There may 
8520: 62 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  be a version of 
8530: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8540: 71 75 65 6e 63 65 20 74 68 61 74 20 72 65 71 75  quence that requ
8550: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  ires.      ** tr
8560: 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74 77 65 65  anslation betwee
8570: 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61  n encodings. Sea
8580: 72 63 68 20 66 6f 72 20 69 74 20 77 69 74 68 20  rch for it with 
8590: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a  synthCollSeq()..
85a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
85b0: 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  f( synthCollSeq(
85c0: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
85d0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
85e0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
85f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
8600: 6f 74 68 69 6e 67 20 68 61 73 20 62 65 65 6e 20  othing has been 
8610: 66 6f 75 6e 64 2c 20 77 72 69 74 65 20 74 68 65  found, write the
8620: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
8630: 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20 20  nto pParse */.  
8640: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
8650: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
8660: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
8670: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
8680: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  r==0 ){.      sq
8690: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
86a0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
86b0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
86c0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 22  tion sequence: "
86d0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
86e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29  zName, nName, 0)
86f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
8700: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8710: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
8720: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
8730: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  ..../*.** Scan t
8740: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
8750: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
8760: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
8770: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
8780: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
8790: 79 70 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ype..*/.char sql
87a0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
87b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79  (const char *zTy
87c0: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
87d0: 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74    int n, i;.  st
87e0: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
87f0: 20 63 68 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a   char *zSub;  /*
8800: 20 4b 65 79 77 6f 72 64 73 20 73 75 62 73 74 72   Keywords substr
8810: 69 6e 67 20 74 6f 20 73 65 61 72 63 68 20 66 6f  ing to search fo
8820: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75  r */.    int nSu
8830: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c  b;          /* l
8840: 65 6e 67 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f  ength of zSub */
8850: 0a 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69  .    char affini
8860: 74 79 3b 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ty;     /* Affin
8870: 69 74 79 20 74 6f 20 72 65 74 75 72 6e 20 69 66  ity to return if
8880: 20 69 74 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20   it matches */. 
8890: 20 7d 20 73 75 62 73 74 72 69 6e 67 73 5b 5d 20   } substrings[] 
88a0: 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20  = {.    {"INT", 
88b0: 20 33 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   3, SQLITE_AFF_I
88c0: 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43  NTEGER},.    {"C
88d0: 48 41 52 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  HAR", 4, SQLITE_
88e0: 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b  AFF_TEXT},.    {
88f0: 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54  "CLOB", 4, SQLIT
8900: 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20  E_AFF_TEXT},.   
8910: 20 7b 22 54 45 58 54 22 2c 20 34 2c 20 53 51 4c   {"TEXT", 4, SQL
8920: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
8930: 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53     {"BLOB", 4, S
8940: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c  QLITE_AFF_NONE},
8950: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79  .  };..  if( nTy
8960: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pe==0 ){.    ret
8970: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
8980: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ONE;.  }.  for(i
8990: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73 75 62  =0; i<sizeof(sub
89a0: 73 74 72 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28  strings)/sizeof(
89b0: 73 75 62 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20  substrings[0]); 
89c0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 31  i++){.    int c1
89d0: 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d   = substrings[i]
89e0: 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e  .zSub[0];.    in
89f0: 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63  t c2 = tolower(c
8a00: 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  1);.    int limi
8a10: 74 20 3d 20 6e 54 79 70 65 20 2d 20 73 75 62 73  t = nType - subs
8a20: 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a  trings[i].nSub;.
8a30: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8a40: 7a 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69  z = substrings[i
8a50: 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66 6f 72 28  ].zSub;.    for(
8a60: 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e  n=0; n<=limit; n
8a70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ++){.      int c
8a80: 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20   = zType[n];.   
8a90: 20 20 20 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c     if( (c==c1 ||
8aa0: 20 63 3d 3d 63 32 29 0a 20 20 20 20 20 20 20 20   c==c2).        
8ab0: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
8ac0: 65 33 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70  e3StrNICmp(&zTyp
8ad0: 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69  e[n], z, substri
8ae0: 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a  ngs[i].nSub) ){.
8af0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
8b00: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66  ubstrings[i].aff
8b10: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20  inity;.      }. 
8b20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8b30: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
8b40: 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ERIC;.}../*.** C
8b50: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65  ome up with a ne
8b60: 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66  w random value f
8b70: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  or the schema co
8b80: 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  okie.  Make sure
8b90: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75  .** the new valu
8ba0: 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  e is different f
8bb0: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a  rom the old..**.
8bc0: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
8bd0: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
8be0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
8bf0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
8c00: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
8c10: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
8c20: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
8c30: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
8c40: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
8c50: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
8c60: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
8c70: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
8c80: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
8c90: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
8ca0: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
8cb0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
8cc0: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
8cd0: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
8ce0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
8cf0: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
8d00: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
8d10: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
8d20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
8d30: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
8d40: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
8d50: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
8d60: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
8d70: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
8d80: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
8d90: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
8da0: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
8db0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
8dc0: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
8dd0: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
8de0: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
8df0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
8e00: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
8e10: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
8e20: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
8e30: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
8e40: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
8e50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
8e60: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
8e70: 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c  te *db, Vdbe *v,
8e80: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 75 6e 73   int iDb){.  uns
8e90: 69 67 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20  igned char r;.  
8ea0: 69 6e 74 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b  int *pSchemaCook
8eb0: 69 65 20 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69  ie = &(db->aDb[i
8ec0: 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
8ed0: 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 61  e);..  sqlite3Ra
8ee0: 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 29 3b  ndomness(1, &r);
8ef0: 0a 20 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69  .  *pSchemaCooki
8f00: 65 20 3d 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b  e = *pSchemaCook
8f10: 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 64 62  ie + r + 1;.  db
8f20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
8f30: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
8f40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8f50: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
8f60: 72 2c 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69  r, *pSchemaCooki
8f70: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
8f80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8f90: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
8fa0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  0);.}../*.** Mea
8fb0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
8fc0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
8fd0: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
8fe0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
8ff0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
9000: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
9010: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
9020: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
9030: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
9040: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
9050: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
9060: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
9070: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9080: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64  nt n;.  int need
9090: 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72  Quote = 0;.  for
90a0: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
90b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
90c0: 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65  ='\'' ){ n++; ne
90d0: 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d  edQuote=1; }.  }
90e0: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65  .  return n + ne
90f0: 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a  edQuote*2;.}../*
9100: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
9110: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
9120: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
9130: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
9140: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
9150: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
9160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
9170: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
9180: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
9190: 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69  zIdent){.  int i
91a0: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
91b0: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
91c0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
91d0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
91e0: 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74   !isalnum(zIdent
91f0: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
9200: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
9210: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
9220: 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20  =  zIdent[j]!=0 
9230: 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e  || isdigit(zIden
9240: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
9250: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
9260: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
9270: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b  dent, j)!=TK_ID;
9280: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9290: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
92a0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
92b0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
92c0: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
92d0: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
92e0: 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20  dent[j]=='\'' ) 
92f0: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
9300: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
9310: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  te ) z[i++] = '\
9320: 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  '';.  z[i] = 0;.
9330: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
9340: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
9350: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9360: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
9370: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
9380: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
9390: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
93a0: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
93b0: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
93c0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
93d0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
93e0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
93f0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
9400: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
9410: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
9420: 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20  tmt(Table *p){. 
9430: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
9440: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
9450: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
9460: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20  2, *zEnd;.  n = 
9470: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
9480: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
9490: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
94a0: 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  gth(p->aCol[i].z
94b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
94c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
94d0: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73  ){.      n += (s
94e0: 74 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d  trlen(p->aCol[i]
94f0: 2e 7a 54 79 70 65 29 20 2b 20 31 29 3b 0a 20 20  .zType) + 1);.  
9500: 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69    }.  }.  n += i
9510: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
9520: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30  ame);.  if( n<40
9530: 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22   ){.    zSep = "
9540: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
9550: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
9560: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
9570: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
9580: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
9590: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
95a0: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
95b0: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
95c0: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
95d0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29  teMallocRaw( n )
95e0: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
95f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
9600: 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e  trcpy(zStmt, p->
9610: 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45  iDb==1 ? "CREATE
9620: 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20   TEMP TABLE " : 
9630: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
9640: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
9650: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
9660: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
9670: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
9680: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
9690: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
96a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63  ; i++){.    strc
96b0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  py(&zStmt[k], zS
96c0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
96d0: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
96e0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
96f0: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
9700: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43  zStmt, &k, p->aC
9710: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
9720: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d    if( p->aCol[i]
9730: 2e 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  .zType ){.      
9740: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
9750: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
9760: 7a 53 74 6d 74 5b 6b 5d 2c 20 70 2d 3e 61 43 6f  zStmt[k], p->aCo
9770: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20  l[i].zType);.   
9780: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 70     k += strlen(p
9790: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
97a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74  ;.    }.  }.  st
97b0: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
97c0: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
97d0: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
97e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
97f0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
9800: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
9810: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
9820: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
9830: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
9840: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
9850: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
9860: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
9870: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
9880: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
9890: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
98a0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
98b0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
98c0: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
98d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
98e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
98f0: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
9900: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
9910: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
9920: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
9930: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
9940: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
9950: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
9960: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
9970: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
9980: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
9990: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
99a0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
99b0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
99c0: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
99d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
99e0: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
99f0: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
9a00: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
9a10: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
9a20: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
9a30: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
9a40: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
9a50: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
9a60: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
9a70: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
9a80: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
9a90: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
9aa0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
9ab0: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
9ac0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
9ad0: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
9ae0: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
9af0: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
9b00: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
9b10: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
9b20: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
9b30: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
9b40: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
9b50: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
9b60: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
9b70: 74 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73  te3EndTable(Pars
9b80: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9b90: 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a   *pEnd, Select *
9ba0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
9bb0: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *p;.  sqlite *
9bc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9bd0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
9be0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
9bf0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
9c00: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
9c10: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
9c20: 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  n;.  p = pParse-
9c30: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
9c40: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
9c50: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
9c60: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
9c70: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
9c80: 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  If the table is 
9c90: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
9ca0: 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f   SELECT, then co
9cb0: 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a  nstruct the.  **
9cc0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
9cd0: 20 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66   and the text of
9ce0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f   the table..  */
9cf0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29  .  if( pSelect )
9d00: 7b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  {.  }..  /* If t
9d10: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
9d20: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
9d30: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
9d40: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
9d50: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
9d60: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
9d70: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
9d80: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
9d90: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
9da0: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
9db0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
9dc0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
9dd0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
9de0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
9df0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
9e00: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
9e10: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
9e20: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
9e30: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
9e40: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
9e50: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
9e60: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
9e70: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
9e80: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
9e90: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
9ea0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
9eb0: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
9ec0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
9ed0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
9ee0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
9ef0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
9f00: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
9f10: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
9f20: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
9f30: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
9f40: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
9f50: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
9f60: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
9f70: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
9f80: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
9f90: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
9fa0: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
9fb0: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
9fc0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
9fd0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
9fe0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
9ff0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
a000: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20      Vdbe *v;..  
a010: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
a020: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a030: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
a040: 75 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  urn;..    if( p-
a050: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
a060: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
a070: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
a080: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a090: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
a0a0: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63  e, 0, p->iDb, (c
a0b0: 68 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50  har*)&p->tnum, P
a0c0: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
a0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
a0e0: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
a0f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a100: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a110: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
a120: 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 0a 20   p->tnum = 0;.. 
a130: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a140: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
a150: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0);..    /* 
a160: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
a170: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
a180: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
a190: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
a1a0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
a1b0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
a1c0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
a1d0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
a1e0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
a1f0: 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74  ew table is on t
a200: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64  he top of the vd
a210: 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  be stack..    **
a220: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
a230: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
a240: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
a250: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
a260: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
a270: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
a280: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
a290: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
a2a0: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
a2b0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
a2c0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
a2d0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
a2e0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
a2f0: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
a300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a310: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
a320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a330: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
a340: 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30  teger, p->iDb, 0
a350: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a360: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a370: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29  OpenWrite, 1, 0)
a380: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a390: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
a3a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
a3b0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53  arse, pSelect, S
a3c0: 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20  RT_Table, 1, 0, 
a3d0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a3e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a3f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
a400: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
a410: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
a420: 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  {.        pSelTa
a430: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
a440: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
a450: 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29  rse, 0, pSelect)
a460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
a470: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
a480: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
a490: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
a4a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  .        p->nCol
a4b0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
a4c0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  ;.        p->aCo
a4d0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
a4e0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
a4f0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
a500: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
a510: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
a520: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
a530: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
a540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a550: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65   .    sqlite3Ope
a560: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
a570: 70 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20 73 71  p->iDb);..    sq
a580: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a590: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a5a0: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f  , p->pSelect==0?
a5b0: 22 74 61 62 6c 65 22 3a 22 76 69 65 77 22 2c 50  "table":"view",P
a5c0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
a5d0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a5e0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
a5f0: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  0, p->zName, 0);
a600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a610: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
a620: 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d  8, 0, 0, p->zNam
a630: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
a640: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a650: 50 5f 50 75 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a  P_Pull, 3, 0);..
a660: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
a670: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a680: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
a690: 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d  mt(p);.      n =
a6a0: 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a   z ? strlen(z) :
a6b0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a6d0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
a6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a6f0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a700: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
a710: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
a720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a730: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  f( p->pSelect ){
a740: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a750: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
a760: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52  ring8, 0, 0, "CR
a770: 45 41 54 45 20 56 49 45 57 20 22 2c 20 50 33 5f  EATE VIEW ", P3_
a780: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
a790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a7a0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a7b0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a7c0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
a7d0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
a7e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a7f0: 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a  ert( pEnd!=0 );.
a800: 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70        n = Addr(p
a810: 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  End->z) - Addr(p
a820: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
a830: 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n.z) + 1;.      
a840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a850: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a860: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a870: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
a880: 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
a890: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29  sNameToken.z, n)
a8a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a8b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
a8c0: 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20  oncat, 2, 0);.  
a8d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
a8e0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
a8f0: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22  eRecord, 5, 0, "
a900: 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49  tttit", P3_STATI
a910: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
a920: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
a930: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
a940: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 21  .    if( p->iDb!
a950: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
a960: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
a970: 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a  db, v, p->iDb);.
a980: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a990: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a9a0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a  _Close, 0, 0);..
a9b0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
a9c0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
a9d0: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
a9e0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
a9f0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
aa00: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
aa10: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
aa20: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
aa30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20  ->explain==0 && 
aa40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
aa50: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
aa60: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
aa70: 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Key;.    pOld = 
aa80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
aa90: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
aaa0: 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20 20 20  b].tblHash, .   
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
aad0: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
aae0: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69  me)+1, p);.    i
aaf0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
ab00: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
ab10: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
ab20: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
ab30: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
ab40: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  t() */.      ret
ab50: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  urn;.    }.    f
ab60: 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65  or(pFKey=p->pFKe
ab70: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
ab80: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
ab90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
aba0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d   = strlen(pFKey-
abb0: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
abc0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
abd0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
abe0: 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  d(&db->aDb[p->iD
abf0: 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  b].aFKey, pFKey-
ac00: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
ac10: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
ac20: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
ac30: 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65  iDb].aFKey, pFKe
ac40: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b  y->zTo, nTo, pFK
ac50: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
ac60: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ac70: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
ac80: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
ac90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
aca0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
acb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
acc0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
acd0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
ace0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
acf0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
ad00: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
ad10: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
ad20: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
ad30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
ad40: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
ad50: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
ad60: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
ad70: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
ad80: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
ad90: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
ada0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
adb0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
adc0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
add0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
ade0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
adf0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
ae00: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
ae10: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
ae20: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
ae30: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
ae40: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
ae50: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
ae60: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
ae70: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
ae80: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
ae90: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
aea0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
aeb0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  st char *z;.  To
aec0: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
aed0: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
aee0: 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c  n *pName;..  sql
aef0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
af00: 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70  Parse, pBegin, p
af10: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
af20: 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d  sTemp, 1);.  p =
af30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
af40: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
af50: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
af60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
af70: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
af80: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
af90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f    }.  sqlite3Two
afa0: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
afb0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
afc0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
afd0: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
afe0: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d  sFix, pParse, p-
aff0: 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e  >iDb, "view", pN
b000: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
b010: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
b020: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
b030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
b040: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
b050: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
b060: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
b070: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
b080: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
b090: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
b0a0: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
b0b0: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
b0c0: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
b0d0: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
b0e0: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
b0f0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
b100: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
b110: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
b120: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
b130: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
b140: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
b150: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
b160: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
b170: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
b180: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
b190: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b1a0: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
b1b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
b1c0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
b1d0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
b1e0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
b1f0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
b200: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
b210: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
b220: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
b230: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
b240: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
b250: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
b260: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
b270: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
b280: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
b290: 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
b2a0: 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  !=0 && sEnd.z[0]
b2b0: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
b2c0: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
b2d0: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
b2e0: 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e  .  n = ((int)sEn
b2f0: 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67  d.z) - (int)pBeg
b300: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65  in->z;.  z = pBe
b310: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
b320: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
b330: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
b340: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
b350: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
b360: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
b370: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
b380: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
b390: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
b3a0: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
b3b0: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
b3c0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
b3d0: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
b3e0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
b3f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
b400: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
b410: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
b420: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
b430: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
b440: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
b450: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
b460: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
b470: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
b480: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
b490: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
b4a0: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
b4b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
b4c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
b4d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
b4e0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
b4f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b500: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
b510: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b520: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t;.  Select *pSe
b530: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  l;.  Table *pSel
b540: 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Tab;.  int nErr 
b550: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
b560: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
b570: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
b580: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
b590: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
b5a0: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
b5b0: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
b5c0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
b5d0: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
b5e0: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
b5f0: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
b600: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
b610: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
b620: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
b630: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
b640: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
b650: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
b660: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
b670: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
b680: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
b690: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
b6a0: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
b6b0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
b6c0: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
b6d0: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
b6e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
b6f0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
b700: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
b710: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
b720: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
b730: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
b740: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
b750: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
b760: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
b770: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
b780: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
b790: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
b7a0: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
b7b0: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
b7c0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
b7d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b7e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b7f0: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
b800: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
b810: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
b820: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b830: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
b840: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
b850: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
b860: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
b870: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  le names..  */. 
b880: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
b890: 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49  >pSelect ); /* I
b8a0: 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  f nCol==0, then 
b8b0: 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  pTable must be a
b8c0: 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20   VIEW */.  pSel 
b8d0: 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  = pTable->pSelec
b8e0: 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68  t;..  /* Note th
b8f0: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
b900: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
b910: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
b920: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
b930: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
b940: 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77  his list.  But w
b950: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
b960: 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a  estore the list.
b970: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
b980: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
b990: 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72  uration afterwar
b9a0: 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61  ds, so we save a
b9b0: 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68   copy of.  ** th
b9c0: 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45  e original in pE
b9d0: 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c  List..  */.  pEL
b9e0: 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69  ist = pSel->pELi
b9f0: 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  st;.  pSel->pELi
ba00: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
ba10: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
ba20: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
ba30: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
ba40: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
ba50: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
ba60: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
ba70: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
ba80: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
ba90: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
baa0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
bab0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
bac0: 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53   pSel);.  if( pS
bad0: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  elTab ){.    ass
bae0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
baf0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  l==0 );.    pTab
bb00: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
bb10: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54  ab->nCol;.    pT
bb20: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
bb30: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
bb40: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
bb50: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
bb60: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
bb70: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
bb80: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
bb90: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
bba0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
bbb0: 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65  le->iDb, DB_Unre
bbc0: 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c  setViews);.  }el
bbd0: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
bbe0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
bbf0: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
bc00: 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  te3SelectUnbind(
bc10: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pSel);.  sqlite3
bc20: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
bc30: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
bc40: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
bc50: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
bc60: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
bc70: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
bc80: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
bc90: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
bca0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bcb0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
bcc0: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
bcd0: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
bce0: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
bcf0: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
bd00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
bd10: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
bd20: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
bd30: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
bd40: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
bd50: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
bd60: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
bd70: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
bd80: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
bd90: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
bda0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
bdb0: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
bdc0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
bdd0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
bde0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
bdf0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
be00: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61  pTable!=0 && pTa
be10: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ble->pSelect!=0 
be20: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
be30: 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  ol=pTable->aCol;
be40: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
be50: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
be60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
be70: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
be80: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
be90: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  >zDflt);.    sql
bea0: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
beb0: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
bec0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
bed0: 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Col);.  pTable->
bee0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
bef0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
bf00: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
bf10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
bf20: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
bf30: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
bf40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
bf50: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
bf60: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
bf70: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
bf80: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
bf90: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
bfa0: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
bfb0: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
bfc0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
bfd0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
bfe0: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
bff0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
c000: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
c010: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c020: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
c030: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
c040: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
c050: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
c060: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
c070: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
c080: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
c090: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
c0a0: 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ws);.}../*.** Gi
c0b0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
c0c0: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
c0d0: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
c0e0: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
c0f0: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
c100: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
c110: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
c120: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
c130: 73 71 6c 69 74 65 33 54 61 62 6c 65 46 72 6f 6d  sqlite3TableFrom
c140: 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61  Token(Parse *pPa
c150: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
c160: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
c170: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
c180: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
c190: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
c1a0: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
c1b0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
c1c0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
c1d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
c1e0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  se->db, zName, 0
c1f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
c200: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
c210: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
c220: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c230: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
c240: 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29 3b  ble: %T", pTok);
c250: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
c260: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
c270: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
c280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c290: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c2a0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
c2b0: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
c2c0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
c2d0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
c2e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
c2f0: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
c300: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
c310: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
c320: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
c330: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
c340: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
c350: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
c360: 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20   base;.  sqlite 
c370: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c380: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
c390: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
c3a0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
c3b0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
c3c0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
c3d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
c3e0: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
c3f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
c400: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
c410: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
c420: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
c430: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
c440: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
c450: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
c460: 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  le;.  iDb = pTab
c470: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
c480: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
c490: 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65  b->nDb );.#ifnde
c4a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c4b0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
c4c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
c4d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
c4e0: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
c4f0: 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  E(pTab->iDb);.  
c500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
c510: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
c520: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
c530: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
c540: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
c550: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
c560: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
c570: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c580: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
c590: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
c5a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
c5b0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
c5c0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
c5d0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
c5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c5f0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
c600: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
c610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
c620: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
c630: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
c640: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
c650: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
c660: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
c670: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
c680: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
c690: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
c6a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
c6b0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
c6c0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
c6d0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
c6e0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
c6f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
c700: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
c710: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
c720: 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
c730: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
c740: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c750: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
c760: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c770: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
c780: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c790: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c7a0: 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
c7b0: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
c7c0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
c7d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c7e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c7f0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
c800: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
c810: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
c820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c830: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
c840: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
c850: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
c860: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
c870: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
c880: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
c890: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
c8a0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
c8b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c8c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
c8d0: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
c8e0: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
c8f0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
c900: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c910: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _table;.  }..  /
c920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c930: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
c940: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
c950: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
c960: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
c970: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c980: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
c990: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
c9a0: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
c9b0: 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  Table[] = {.    
c9c0: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
c9d0: 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20     0, ADDR(13), 
c9e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
c9f0: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c  tring8,    0, 0,
ca00: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31          0}, /* 1
ca10: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
ca20: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
ca30: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
ca40: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
ca50: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
ca60: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
ca70: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
ca80: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
ca90: 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  0}, /* sqlite_ma
caa0: 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f  ster.tbl_name */
cab0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
cac0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
cad0: 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  12), 0},.      {
cae0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
caf0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 74 72  0, 0,        "tr
cb00: 69 67 67 65 72 22 7d 2c 0a 20 20 20 20 20 20 7b  igger"},.      {
cb10: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
cb20: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
cb30: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
cb40: 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20  r.type */.      
cb50: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
cb60: 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d   0, ADDR(12), 0}
cb70: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
cb80: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
cb90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
cba0: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
cbb0: 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d   0, ADDR(13), 0}
cbc0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74  ,.      { OP_Got
cbd0: 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  o,       0, ADDR
cbe0: 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (3),  0},.      
cbf0: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
cc00: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
cc10: 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7d  , /* 12 */.    }
cc20: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
cc30: 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  x;.    Trigger *
cc40: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71  pTrigger;.    sq
cc50: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
cc60: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
cc70: 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a   0, pTab->iDb);.
cc80: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
cc90: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
cca0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
ccb0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
ccc0: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
ccd0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
cce0: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
ccf0: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
cd00: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
cd10: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
cd20: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
cd30: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
cd40: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
cd50: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
cd60: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
cd70: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
cd80: 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  er->iDb==pTab->i
cd90: 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e  Db || pTrigger->
cda0: 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  iDb==1 );.      
cdb0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
cdc0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
cdd0: 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  rigger, 1);.    
cde0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
cdf0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
ce00: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
ce10: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
ce20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ce30: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
ce40: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
ce50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ce60: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
ce70: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
ce80: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
ce90: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
cea0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
ceb0: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
cec0: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
ced0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
cee0: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
cef0: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
cf00: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
cf10: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
cf20: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
cf30: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
cf40: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
cf50: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
cf60: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
cf70: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
cf80: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
cf90: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
cfa0: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
cfb0: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
cfc0: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
cfd0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
cfe0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
cff0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
d000: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73  b->iDb);.    bas
d010: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
d020: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
d030: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
d040: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
d050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d060: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
d070: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
d080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
d090: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
d0a0: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
d0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0c0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
d0d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69  , 0);.    if( !i
d0e0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
d0f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d100: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
d110: 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  Tab->tnum, pTab-
d120: 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  >iDb);.      for
d130: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d140: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d150: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
d160: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d170: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
d180: 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  roy, pIdx->tnum,
d190: 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20   pIdx->iDb);.   
d1a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d1b0: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
d1c0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
d1d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
d1e0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
d1f0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
d200: 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  he table..  **. 
d210: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69   ** Exception: i
d220: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
d230: 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74  ent began with t
d240: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
d250: 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f  rd,.  ** then no
d260: 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20   changes should 
d270: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
d280: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
d290: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
d2a0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
d2b0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
d2c0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
d2d0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
d2e0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73  Changes;.  }.  s
d2f0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
d300: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
d310: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
d320: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
d330: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
d340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
d360: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
d370: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
d380: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
d390: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
d3a0: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
d3b0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
d3c0: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
d3d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
d3e0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
d3f0: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
d400: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
d410: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
d420: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
d430: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
d440: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
d450: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
d460: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
d470: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
d480: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
d490: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
d4a0: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
d4b0: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
d4c0: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
d4d0: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
d4e0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
d4f0: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
d500: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
d510: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
d520: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
d530: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
d540: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
d550: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
d560: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
d570: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
d580: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
d590: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
d5a0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
d5b0: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
d5c0: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
d5d0: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
d5e0: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
d5f0: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
d600: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
d610: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
d620: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
d630: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
d640: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
d650: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
d660: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
d670: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
d680: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
d690: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
d6a0: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
d6b0: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
d6c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d6d0: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
d6e0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d6f0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
d700: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d710: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
d720: 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
d730: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
d740: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
d750: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
d760: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
d770: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
d780: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
d790: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
d7a0: 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
d7b0: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
d7c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
d7d0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
d7e0: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
d7f0: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
d800: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
d810: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
d820: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
d830: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
d840: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
d850: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
d860: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
d870: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
d880: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
d890: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
d8a0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
d8b0: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
d8c0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
d8d0: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
d8e0: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
d8f0: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
d900: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
d910: 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
d920: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d930: 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
d940: 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
d950: 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
d960: 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
d970: 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
d980: 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
d990: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
d9a0: 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
d9b0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
d9c0: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
d9d0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
d9e0: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
d9f0: 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
da00: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
da10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
da20: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
da30: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
da40: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
da50: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
da60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
da70: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
da80: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
da90: 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
daa0: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
dab0: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
dac0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
dad0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
dae0: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
daf0: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
db00: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
db10: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
db20: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
db30: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
db40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
db50: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
db60: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
db70: 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
db80: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
db90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
dba0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
dbb0: 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66  FKey==0 ) goto f
dbc0: 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e  k_end;.  pFKey->
dbd0: 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
dbe0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
dbf0: 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
dc00: 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
dc10: 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
dc20: 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
dc30: 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
dc40: 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
dc50: 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
dc60: 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
dc70: 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
dc80: 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
dc90: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
dca0: 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
dcb0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
dcc0: 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
dcd0: 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
dce0: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
dcf0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
dd00: 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
dd10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
dd20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
dd30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
dd40: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
dd50: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
dd60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
dd70: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
dd80: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
dd90: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
dda0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
ddb0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
ddc0: 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
ddd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
dde0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ddf0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
de00: 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
de10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
de20: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
de30: 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
de40: 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
de50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
de60: 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
de70: 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
de80: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
de90: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
dea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
deb0: 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
dec0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
ded0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
dee0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
def0: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
df00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
df10: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
df20: 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
df30: 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
df40: 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
df50: 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
df60: 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
df70: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
df80: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
df90: 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
dfa0: 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
dfb0: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
dfc0: 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
dfd0: 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
dfe0: 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
dff0: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
e000: 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
e010: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
e020: 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
e030: 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
e040: 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
e050: 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
e060: 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
e070: 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
e080: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71  ree(pFKey);.  sq
e090: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
e0a0: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
e0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e0c0: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
e0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
e0e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
e0f0: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
e100: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
e110: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
e120: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
e130: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
e140: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
e150: 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
e160: 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
e170: 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
e180: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
e190: 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
e1a0: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
e1b0: 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
e1c0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
e1d0: 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
e1e0: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
e1f0: 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
e200: 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
e210: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
e220: 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
e230: 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
e240: 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ed){.  Table *pT
e250: 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
e260: 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
e270: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e280: 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
e290: 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
e2a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
e2b0: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
e2c0: 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d   = isDeferred;.}
e2d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
e2e0: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
e2f0: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
e300: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
e310: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
e320: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
e330: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e340: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
e350: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
e360: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
e370: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
e380: 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
e390: 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
e3a0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
e3b0: 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
e3c0: 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
e3d0: 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
e3e0: 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
e3f0: 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
e400: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
e410: 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
e420: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
e430: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
e440: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
e450: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
e460: 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
e470: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
e480: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
e490: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
e4a0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
e4b0: 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
e4c0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
e4d0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
e4e0: 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
e4f0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
e500: 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
e510: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
e520: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
e530: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
e540: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e550: 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
e560: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e570: 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
e580: 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
e590: 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
e5a0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
e5b0: 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
e5c0: 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
e5d0: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
e5e0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
e5f0: 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
e600: 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
e610: 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
e620: 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54  *pTblName,  /* T
e630: 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
e640: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
e650: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
e660: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
e670: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
e680: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
e690: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
e6a0: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
e6b0: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
e6c0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
e6d0: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
e6e0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
e6f0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
e700: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
e710: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e720: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
e730: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
e740: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
e750: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
e760: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
e770: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
e780: 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62  pTab = 0; /* Tab
e790: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
e7a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
e7b0: 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  dex = 0; /* The 
e7c0: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
e7d0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
e7e0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
e7f0: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
e800: 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
e810: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
e820: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
e830: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
e840: 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
e850: 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
e860: 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
e870: 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
e880: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
e890: 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
e8a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
e8b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
e8c0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
e8d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
e8e0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
e8f0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
e900: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
e910: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75  ame = 0; /* Unqu
e920: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
e930: 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
e940: 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ate */..  if( pP
e950: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
e960: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
e970: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
e980: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
e990: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
e9a0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
e9b0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
e9c0: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
e9d0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
e9e0: 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
e9f0: 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
ea00: 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
ea10: 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
ea20: 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
ea30: 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
ea40: 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
ea50: 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
ea60: 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
ea70: 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
ea80: 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
ea90: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
eaa0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
eab0: 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
eac0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
ead0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
eae0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
eaf0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
eb00: 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
eb10: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
eb20: 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  dex;..    /* If 
eb30: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
eb40: 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
eb50: 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65  check if the the
eb60: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
eb70: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
eb80: 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
eb90: 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20  tabase to 1..   
eba0: 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73   */.    pTab = s
ebb0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
ebc0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
ebd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
ebe0: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
ebf0: 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
ec00: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b   pTab->iDb==1 ){
ec10: 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a  .      iDb = 1;.
ec20: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
ec30: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
ec40: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
ec50: 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
ec60: 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
ec70: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
ec80: 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
ec90: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
eca0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
ecb0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
ecc0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
ecd0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
ece0: 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
ecf0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
ed00: 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
ed10: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69  Database);.    i
ed20: 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
ed30: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ed40: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  x;.    assert( i
ed50: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
ed60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
ed70: 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
ed80: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
ed90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
eda0: 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d  .    iDb = pTab-
edb0: 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  >iDb;.  }..  if(
edc0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
edd0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
ede0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
edf0: 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
ee00: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
ee10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ee20: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
ee30: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
ee40: 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
ee50: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
ee60: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ee70: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
ee80: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
ee90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
eea0: 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
eeb0: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
eec0: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
eed0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
eee0: 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70    }.  isTemp = p
eef0: 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20  Tab->iDb==1;..  
ef00: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
ef10: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
ef20: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
ef30: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
ef40: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
ef50: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
ef60: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
ef70: 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
ef80: 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
ef90: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
efa0: 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
efb0: 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
efc0: 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
efd0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
efe0: 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
eff0: 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
f000: 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
f010: 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
f020: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
f030: 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
f040: 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
f050: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
f060: 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
f070: 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
f080: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
f090: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
f0a0: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
f0b0: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
f0c0: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
f0d0: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
f0e0: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
f0f0: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
f100: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
f110: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
f120: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
f130: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
f140: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
f150: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
f160: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
f170: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
f180: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
f190: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
f1a0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
f1b0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
f1c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
f1d0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f1e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
f1f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
f200: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53        Index *pIS
f210: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
f220: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
f230: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
f240: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
f250: 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pTSameName;    /
f260: 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73  * A table with s
f270: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
f280: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
f290: 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d  f( (pISameName =
f2a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
f2b0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d  x(db, zName, db-
f2c0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
f2d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
f2e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f2f0: 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
f300: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
f310: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
f320: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
f330: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
f340: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
f350: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
f360: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
f370: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
f380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f390: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f3a0: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
f3b0: 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
f3c0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
f3d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f3e0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f3f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
f400: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
f410: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
f420: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
f430: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
f440: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
f450: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
f460: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
f470: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
f480: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
f490: 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29  tf(zBuf,"_%d",n)
f4a0: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
f4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
f4c0: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73  tring(&zName, "s
f4d0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
f4e0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
f4f0: 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
f500: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
f510: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
f520: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
f530: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
f540: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
f550: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
f560: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
f570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
f580: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
f590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
f5a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
f5b0: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
f5c0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
f5d0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
f5e0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
f5f0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
f600: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
f610: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f620: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f630: 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
f640: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
f650: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20     if( isTemp ) 
f660: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
f670: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
f680: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f690: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
f6a0: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
f6b0: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
f6c0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f6d0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f6e0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
f6f0: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
f700: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
f710: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
f720: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
f730: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
f740: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
f750: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
f760: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
f770: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
f780: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
f790: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
f7a0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
f7b0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
f7c0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
f7d0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
f7e0: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
f7f0: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
f800: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
f810: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
f820: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
f830: 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
f840: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f850: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
f860: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
f870: 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
f880: 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
f890: 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
f8a0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
f8b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
f8c0: 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a  ndex) + strlen(z
f8d0: 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20  Name) + 1 +.    
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
f900: 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   + sizeof(CollSe
f910: 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  q*))*pList->nExp
f920: 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  r );.  if( pInde
f930: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
f940: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f950: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
f960: 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
f970: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
f980: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
f990: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
f9a0: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
f9b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
f9c0: 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63  ->nExpr];.  strc
f9d0: 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
f9e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
f9f0: 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
fa00: 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
fa10: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
fa20: 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
fa30: 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
fa40: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
fa50: 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
fa60: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
fa70: 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
fa80: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
fa90: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
faa0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
fab0: 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
fac0: 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
fad0: 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
fae0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
faf0: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
fb00: 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
fb10: 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
fb20: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
fb30: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
fb40: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
fb50: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
fb60: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
fb70: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
fb80: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
fb90: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
fba0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
fbb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fbc0: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
fbd0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
fbe0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fbf0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
fc00: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
fc10: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
fc20: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
fc30: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
fc40: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
fc50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
fc60: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
fc70: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
fc80: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
fc90: 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20  a[i].pExpr ){.  
fca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
fcb0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
fcc0: 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49  Coll );.      pI
fcd0: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
fce0: 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e  oll[i] = pList->
fcf0: 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
fd00: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
fd10: 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
fd20: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
fd30: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
fd40: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ll;.    }.    as
fd50: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65  sert( pIndex->ke
fd60: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
fd70: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
fd80: 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20  nit.busy && .   
fd90: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
fda0: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
fdb0: 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
fdc0: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20  .aColl[i]) .    
fdd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fde0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
fdf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
fe00: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
fe10: 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
fe20: 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  pr;..  if( pTab=
fe30: 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
fe40: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
fe50: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
fe60: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
fe70: 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
fe80: 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
fe90: 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
fea0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
feb0: 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
fec0: 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
fed0: 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
fee0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
fef0: 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
ff00: 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
ff10: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
ff20: 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
ff30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
ff40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
ff50: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
ff60: 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
ff70: 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
ff80: 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
ff90: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
ffa0: 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
ffb0: 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
ffc0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
ffd0: 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
ffe0: 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
fff0: 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
10000 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
10010 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
10020 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
10030 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
10040 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
10050 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
10060 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
10070 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
10080 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
10090 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
100a0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
100b0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
100c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
100d0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
100e0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
100f0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
10100 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
10110 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
10120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10130 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
10140 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
10150 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
10160 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
10170 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
10180 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
10190 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
101a0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
101b0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
101c0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
101d0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
101e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
101f0 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
10200 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  l[k]!=pIndex->ke
10210 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29  yInfo.aColl[k] )
10220 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10230 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
10240 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
10250 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
10260 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
10270 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
10280 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
10290 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
102a0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
102b0 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
102c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
102d0 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
102e0 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
102f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10300 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
10310 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
10320 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
10330 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
10340 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
10350 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
10360 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
10370 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
10380 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
10390 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
103a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
103b0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
103c0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
103d0 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
103e0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
103f0 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
10400 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
10410 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
10420 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
10430 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
10440 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
10450 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
10460 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
10470 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
10480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
10490 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
104c0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
104d0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
104e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
104f0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
10500 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
10510 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
10520 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
10530 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
10540 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
10550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10560 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
10570 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
10580 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10590 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
105a0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
105b0 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
105c0 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
105d0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
105e0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
105f0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  . .  */.  if( !p
10600 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
10610 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
10620 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
10630 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
10640 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
10650 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
10680 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
10690 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
106a0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
106b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
106c0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
106d0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
106e0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
106f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10700 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
10710 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
10720 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
10730 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nges;.  }..  /* 
10740 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
10750 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
10760 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
10770 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
10780 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
10790 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
107a0 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
107b0 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
107c0 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
107d0 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
107e0 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f  table number fro
107f0 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
10800 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20  ewTnum field..  
10810 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
10820 74 2e 62 75 73 79 20 26 26 20 70 54 62 6c 4e 61  t.busy && pTblNa
10830 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  me!=0 ){.    pIn
10840 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
10850 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
10860 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
10870 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
10880 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
10890 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
108a0 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
108b0 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
108c0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
108d0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
108e0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
108f0 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
10900 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10910 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
10920 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
10930 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
10940 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
10950 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
10960 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
10970 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
10980 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
10990 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
109a0 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
109b0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
109c0 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
109d0 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
109e0 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
109f0 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
10a00 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
10a10 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
10a20 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
10a30 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
10a40 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
10a50 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
10a60 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
10a70 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
10a80 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
10a90 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
10aa0 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
10ab0 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
10ac0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
10ad0 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
10ae0 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
10af0 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
10b00 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
10b10 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
10b20 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
10b30 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
10b40 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
10b50 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
10b60 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
10b70 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
10b80 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74  Vdbe *v;.    int
10b90 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 0a 20 20   lbl1, lbl2;..  
10ba0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10bb0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10bc0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
10bd0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10be0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 62  dex;.    if( pTb
10bf0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
10c00 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
10c10 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
10c20 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
10c30 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
10c40 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
10c50 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
10c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10c70 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
10c80 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10c90 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
10ca0 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 69  tring8, 0, 0, "i
10cb0 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43  ndex", P3_STATIC
10cc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10cd0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
10ce0 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  ng8, 0, 0, pInde
10cf0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
10d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
10d10 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
10d20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10d30 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
10d40 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
10d50 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20  CreateIndex, 0, 
10d60 69 44 62 2c 28 63 68 61 72 2a 29 26 70 49 6e 64  iDb,(char*)&pInd
10d70 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50 4f 49 4e  ex->tnum,P3_POIN
10d80 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  TER);.    pIndex
10d90 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  ->tnum = 0;.    
10da0 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
10db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10dc0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
10dd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
10de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10df0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
10e00 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
10e10 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10e20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
10e30 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
10e40 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
10e50 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
10e60 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
10e70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10e80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10e90 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
10ea0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
10eb0 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
10ec0 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
10ed0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  None ){.        
10ee0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10ef0 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41  eP3(v, -1, "CREA
10f00 54 45 20 49 4e 44 45 58 20 22 2c 20 50 33 5f 53  TE INDEX ", P3_S
10f10 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  TATIC);.      }e
10f20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10f30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
10f40 28 76 2c 20 2d 31 2c 20 22 43 52 45 41 54 45 20  (v, -1, "CREATE 
10f50 55 4e 49 51 55 45 20 49 4e 44 45 58 20 22 2c 20  UNIQUE INDEX ", 
10f60 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10f70 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10f80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10f90 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
10fa0 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28  .      n = Addr(
10fb0 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
10fc0 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20  pName->z) + 1;. 
10fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fe0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10ff0 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  pName->z, n);.  
11000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11010 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  ddOp(v, OP_Conca
11020 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 2, 0);.    }.
11030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
11040 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
11050 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74 69  ord, 5, 0, "ttti
11060 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  t", P3_STATIC);.
11070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11080 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
11090 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
110a0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
110b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
110c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
110d0 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62  teger, pTab->iDb
110e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
110f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11100 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20  OP_OpenRead, 2, 
11110 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
11120 20 20 20 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e     /* VdbeCommen
11130 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62  t((v, "%s", pTab
11140 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20  ->zName)); */.  
11150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11160 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
11170 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61  mColumns, 2, pTa
11180 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->nCol);.      
11190 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 33 56 64  lbl2 = sqlite3Vd
111a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
111b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
111c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
111d0 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
111e0 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
111f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
11200 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
11210 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
11220 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20  xKey(v, pIndex, 
11230 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
11240 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49  3VdbeOp3(v, OP_I
11250 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78  dxPut, 1, pIndex
11260 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
11270 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne,.            
11280 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
11290 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
112a0 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
112b0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
112c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
112d0 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
112e0 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l1);.      sqlit
112f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11300 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
11310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11320 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11330 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
11340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11350 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
11360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11370 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
11380 20 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d        if( !isTem
11390 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
113a0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
113b0 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
113c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
113d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
113e0 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
113f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
11400 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
11410 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
11420 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
11430 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
11440 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
11450 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
11460 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
11470 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
11480 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
11490 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
114a0 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
114b0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
114c0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
114d0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
114e0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
114f0 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
11500 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
11510 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
11520 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
11530 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
11540 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
11550 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
11560 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
11570 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
11580 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
11590 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
115a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
115b0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
115c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
115d0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
115e0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
115f0 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
11600 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
11610 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
11620 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
11630 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
11640 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
11650 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
11660 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
11670 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
11680 20 30 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20   0;..  /* Clean 
11690 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
116a0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
116b0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
116c0 6e 64 65 78 20 29 20 73 71 6c 69 74 65 46 72 65  ndex ) sqliteFre
116d0 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  e(pIndex);.  sql
116e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
116f0 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
11700 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
11710 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  e(pTblName);.  s
11720 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
11730 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
11740 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11750 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
11760 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
11770 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
11780 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
11790 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
117a0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
117b0 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
117c0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
117d0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
117e0 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
117f0 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
11800 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
11810 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
11820 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
11830 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
11840 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
11850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
11860 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
11870 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
11880 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
11890 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
118a0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
118b0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
118c0 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
118d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
118e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
118f0 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
11900 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
11910 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
11920 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
11930 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
11940 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
11950 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
11960 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11970 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
11980 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11990 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
119a0 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
119b0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
119c0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
119d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
119e0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
119f0 0a 2f 2a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ./*.  if( pIndex
11a00 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 73  ->iDb>1 ){.    s
11a10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11a20 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61  Parse, "cannot a
11a30 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61  lter schema of a
11a40 74 74 61 63 68 65 64 20 22 0a 20 20 20 20 20 20  ttached ".      
11a50 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 30 29   "databases", 0)
11a60 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
11a70 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
11a80 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11a90 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11aa0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
11ab0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
11ac0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
11ad0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
11ae0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
11af0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
11b00 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
11b10 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
11b20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11b30 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
11b40 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
11b50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11b60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11b70 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
11b80 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
11b90 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11ba0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
11bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
11bc0 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
11bd0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
11be0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
11bf0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
11c00 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
11c10 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
11c20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
11c30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11c40 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
11c50 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11c60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11c70 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
11c80 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
11c90 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
11ca0 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
11cb0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11cc0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
11cd0 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
11ce0 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d  List dropIndex[]
11cf0 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
11d00 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
11d10 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20  DDR(9), 0}, .   
11d20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
11d30 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
11d40 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20   0}, /* 1 */.   
11d50 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
11d60 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
11d70 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
11d80 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
11d90 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
11da0 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
11db0 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
11dc0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11dd0 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
11de0 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c   0, ADDR(8), 0},
11df0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
11e00 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
11e10 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  3), 0},.      { 
11e20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
11e30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20  , ADDR(9), 0},. 
11e40 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
11e50 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
11e60 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
11e70 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73    };.    int bas
11e80 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e;..    sqlite3B
11e90 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
11ea0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49  on(pParse, 0, pI
11eb0 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
11ec0 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
11ed0 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78  rTable(v, pIndex
11ee0 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65  ->iDb);.    base
11ef0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11f00 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
11f10 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c  Size(dropIndex),
11f20 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20   dropIndex);.   
11f30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11f40 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
11f50 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
11f60 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
11f70 78 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  x->iDb!=1 ){.   
11f80 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
11f90 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 49  Cookie(db, v, pI
11fa0 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
11fb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
11fc0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11fd0 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  se, 0, 0);.    s
11fe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11ff0 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
12000 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e  Index->tnum, pIn
12010 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73  dex->iDb);.    s
12020 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
12030 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
12040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
12050 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
12060 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
12070 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  his index..  */.
12080 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
12090 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
120a0 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
120b0 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
120c0 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ndex);.    db->f
120d0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
120e0 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
120f0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
12100 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
12110 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
12120 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  );.}../*.** Appe
12130 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
12140 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
12150 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
12160 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
12170 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
12180 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
12190 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
121a0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
121b0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
121c0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
121d0 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
121e0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
121f0 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
12200 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
12210 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
12220 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
12230 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
12240 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12250 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
12260 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
12270 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74  List->nId>=pList
12280 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
12290 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
122a0 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74  em *a;.    pList
122b0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74  ->nAlloc = pList
122c0 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  ->nAlloc*2 + 5;.
122d0 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
122e0 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
122f0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
12300 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
12310 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ) );.    if( a==
12320 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12330 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
12340 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
12350 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
12360 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
12370 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
12380 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
12390 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
123a0 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c  st->a[0]));.  pL
123b0 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
123c0 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  d].zName = sqlit
123d0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
123e0 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74  pToken);.  pList
123f0 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
12400 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
12410 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
12420 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
12430 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
12440 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
12450 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
12460 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
12470 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
12480 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
12490 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
124a0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  LL..**.** A new 
124b0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
124c0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
124d0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
124e0 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
124f0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
12500 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
12510 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
12520 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
12530 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
12540 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
12550 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
12560 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
12570 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
12580 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
12590 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
125a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
125b0 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
125c0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
125d0 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
125e0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
125f0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
12600 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
12610 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
12620 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
12630 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
12640 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
12650 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
12660 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
12670 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
12680 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
12690 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
126a0 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
126b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
126c0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
126d0 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
126e0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
126f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
12700 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
12710 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
12720 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
12730 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
12740 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
12750 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
12760 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
12770 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
12780 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a  Append(A,B,C);.*
12790 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
127a0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
127b0 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
127c0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
127d0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
127e0 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69  ListAppend(SrcLi
127f0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
12800 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20   *pTable, Token 
12810 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73  *pDatabase){.  s
12820 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
12830 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
12840 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
12850 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
12860 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
12870 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
12880 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
12890 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
128a0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
128b0 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
128c0 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  Src>=pList->nAll
128d0 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
128e0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69  t *pNew;.    pLi
128f0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
12900 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
12910 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
12920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12930 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
12940 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d   (pList->nAlloc-
12950 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  1)*sizeof(pList-
12960 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
12970 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
12980 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
12990 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
129a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
129b0 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
129c0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49  = pNew;.  }.  pI
129d0 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
129e0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20  pList->nSrc];.  
129f0 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
12a00 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
12a10 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61  [0]));.  if( pDa
12a20 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
12a30 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
12a40 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
12a50 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
12a60 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b  ase && pTable ){
12a70 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
12a80 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
12a90 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
12aa0 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
12ab0 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
12ac0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
12ad0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
12ae0 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20  oken(pTable);.  
12af0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
12b00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
12b10 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73  omToken(pDatabas
12b20 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75  e);.  pItem->iCu
12b30 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69  rsor = -1;.  pLi
12b40 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65  st->nSrc++;.  re
12b50 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
12b60 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73  *.** Assign curs
12b70 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ors to all table
12b80 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
12b90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
12ba0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
12bb0 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
12bc0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
12bd0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
12be0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
12bf0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
12c00 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
12c10 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20  iCursor<0 ){.   
12c20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69     pList->a[i].i
12c30 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
12c40 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nTab++;.    }. 
12c50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
12c60 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
12c70 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
12c80 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
12c90 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
12ca0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
12cb0 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
12cc0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
12cd0 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
12ce0 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
12cf0 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
12d00 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
12d10 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20  >nSrc-1].zAlias 
12d20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
12d30 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
12d40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
12d50 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
12d60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
12d70 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73  ListDelete(IdLis
12d80 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
12d90 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
12da0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
12db0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
12dc0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
12dd0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
12de0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
12df0 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
12e00 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
12e10 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
12e20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
12e30 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
12e40 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
12e50 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
12e60 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
12e70 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
12e80 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
12e90 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
12ea0 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
12eb0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
12ec0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
12ed0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
12ee0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12ef0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
12f00 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12f10 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
12f20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
12f30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
12f40 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
12f50 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
12f60 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
12f70 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
12f80 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
12f90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
12fa0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
12fb0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
12fc0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
12fd0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
12fe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
12ff0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
13000 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
13010 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  List->a[i].zData
13020 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
13030 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
13040 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
13050 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
13060 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
13070 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
13080 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
13090 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
130a0 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
130b0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
130c0 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b  ble(0, pList->a[
130d0 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  i].pTab);.    }.
130e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
130f0 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
13100 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
13110 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
13120 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
13130 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
13140 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
13150 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67  ist->a[i].pUsing
13160 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
13170 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
13180 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
13190 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
131a0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
131b0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
131c0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
131d0 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e *db;.  Vdbe *v
131e0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
131f0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
13200 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
13210 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
13220 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
13230 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
13240 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
13250 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
13260 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
13270 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
13280 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
13290 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
132a0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
132b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
132c0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
132d0 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  v ) return;.  sq
132e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
132f0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
13300 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
13310 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
13320 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
13330 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
13340 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
13350 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
13360 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
13370 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
13380 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
13390 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
133a0 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
133b0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
133c0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
133d0 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
133e0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
133f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13400 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
13410 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
13420 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
13430 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
13440 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13450 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
13460 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13470 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
13480 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
13490 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
134a0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
134b0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
134c0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
134d0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
134e0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
134f0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
13500 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
13510 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
13520 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
13530 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
13540 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
13550 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
13560 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
13570 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
13580 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
13590 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
135a0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
135b0 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
135c0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
135d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
135e0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
135f0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
13600 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13610 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
13620 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
13630 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
13640 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
13650 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
13660 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
13670 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
13680 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
13690 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
136a0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
136b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
136c0 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
136d0 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
136e0 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
136f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
13700 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
13710 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
13720 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
13730 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
13740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
13750 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
13760 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
13770 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
13780 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
13790 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
137a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
137b0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
137c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
137d0 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 73 75   code an OP_Gosu
137e0 62 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a  b that.** will j
137f0 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74  ump to a subrout
13800 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ine at the end o
13810 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
13820 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72  Then we.** recor
13830 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  d every database
13840 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20   that needs its 
13850 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20  schema verified 
13860 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  in the.** pParse
13870 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65  ->cookieMask fie
13880 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65  ld.  Later, afte
13890 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65  r all other code
138a0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e   has been.** gen
138b0 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72  erated, the subr
138c0 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
138d0 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
138e0 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  fications and.**
138f0 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e   starts the tran
13900 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
13910 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f   coded and the O
13920 50 5f 47 6f 73 75 62 20 50 32 20 76 61 6c 75 65  P_Gosub P2 value
13930 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
13940 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
13950 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
13960 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
13970 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
13980 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
13990 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
139a0 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
139b0 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f  nishCoding()..*/
139c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
139d0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
139e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
139f0 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20   iDb){.  sqlite 
13a00 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
13a10 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
13a20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
13a30 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
13a40 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
13a50 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
13a60 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
13a70 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
13a80 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
13a90 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
13aa0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
13ab0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
13ac0 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
13ad0 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
13ae0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
13af0 44 62 3c 33 32 20 29 3b 0a 20 20 69 66 28 20 70  Db<32 );.  if( p
13b00 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
13b10 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  k==0 ){.    pPar
13b20 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
13b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13b40 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
13b50 20 30 29 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20   0);.  }.  mask 
13b60 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
13b70 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d  (pParse->cookieM
13b80 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
13b90 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
13ba0 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
13bb0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
13bc0 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
13bd0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63   db->aDb[iDb].sc
13be0 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 7d  hema_cookie;.  }
13bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13c00 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
13c10 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
13c20 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
13c30 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
13c40 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
13c50 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
13c60 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
13c70 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
13c80 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
13c90 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
13ca0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
13cb0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
13cc0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
13cd0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
13ce0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
13cf0 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
13d00 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
13d10 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
13d20 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
13d30 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
13d40 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
13d50 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
13d60 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
13d70 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
13d80 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
13d90 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
13da0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
13db0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
13dc0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
13dd0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
13de0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
13df0 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
13e00 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
13e10 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
13e20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
13e30 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
13e40 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
13e50 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
13e60 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
13e70 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
13e80 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
13e90 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
13ea0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
13eb0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
13ec0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
13ed0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
13ee0 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
13ef0 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
13f00 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
13f10 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
13f20 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
13f30 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
13f40 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
13f50 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
13f60 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
13f70 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
13f80 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
13f90 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
13fa0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
13fb0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
13fc0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
13fd0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13fe0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
13ff0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
14000 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
14010 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
14020 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14030 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
14040 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
14050 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
14060 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
14070 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
14080 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
14090 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
140a0 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
140b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
140c0 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69   OP_Statement, i
140d0 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  Db, 0);.  }.  if
140e0 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
140f0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
14100 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
14110 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  e, setStatement,
14120 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
14130 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14140 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
14150 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
14160 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
14170 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
14180 65 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d 65  e.  If a stateme
14190 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
141a0 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
141b0 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43   emit.** an OP_C
141c0 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c 20  ommit that will 
141d0 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
141e0 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65  s to be committe
141f0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
14200 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b   Note that check
14210 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f 6d  points are autom
14220 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74  atically committ
14230 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
14240 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  .** a statement.
14250 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
14260 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75   there can be mu
14270 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
14280 0a 2a 2a 20 73 71 6c 69 74 65 33 42 65 67 69 6e  .** sqlite3Begin
14290 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29  WriteOperation()
142a0 20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75 6c   but there shoul
142b0 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  d only be a sing
142c0 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  le.** call to sq
142d0 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
142e0 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20  ration() at the 
142f0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
14300 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  e statement..*/.
14310 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 57  void sqlite3EndW
14320 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
14330 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14340 2f 2a 20 44 65 6c 65 74 65 20 6d 65 21 20 2a 2f  /* Delete me! */
14350 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
14360 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20   .** Return the 
14370 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69 74 65  transient sqlite
14380 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 75  3_value object u
14390 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67  sed for encoding
143a0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20   conversions.** 
143b0 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69  during SQL compi
143c0 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  lation..*/.sqlit
143d0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
143e0 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
143f0 75 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  ue(sqlite *db){.
14400 20 20 69 66 28 20 21 64 62 2d 3e 70 56 61 6c 75    if( !db->pValu
14410 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61  e ){.    db->pVa
14420 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  lue = sqlite3Val
14430 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72  ueNew();.  }.  r
14440 65 74 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65  eturn db->pValue
14450 3b 0a 7d 0a                                      ;.}.